DynamoDB — The expression can not be empty

TL;DR — Você passou um parâmetro de expressão (FilterExpression, KeyConditionExpression, ProjectionExpression, UpdateExpression ou ConditionExpression) como uma string vazia "". O DynamoDB exige que os parâmetros de expressão sejam ou uma expressão válida e não vazia ou totalmente ausentes — uma string vazia é inválida. Inclua o parâmetro apenas quando você de fato tem uma expressão; caso contrário, omita a chave.

O que significa

ValidationException: Invalid FilterExpression: The expression can not be empty;
ValidationException: Invalid KeyConditionExpression: The expression can not be empty;

O DynamoDB trata uma string vazia de forma diferente de um parâmetro omitido. Omitir FilterExpression significa "sem filtro"; passar FilterExpression: "" significa "aqui está um filtro" — e então não há nada para fazer parse, então a validação falha. O mesmo se aplica a todo parâmetro de expressão.

Por que acontece

  • Params construídos condicionalmente sempre definidos — o código sempre anexa FilterExpression ao objeto de requisição, e então o deixa "" quando nenhum filtro foi escolhido.
  • Um helper/ORM/connector que emite uma string de expressão vazia em vez de remover a chave quando a lista de filtros está vazia.
  • Concatenação de string que não produziu nada — juntar um array vazio de condições produz "".
  • Conteúdo cortado — placeholders foram removidos, deixando uma expressão vazia.

Como corrigir

  1. Só defina o parâmetro quando ele não é vazio. Construa o objeto de params condicionalmente: if (filter) params.FilterExpression = filter; — nunca atribua "".
  2. Exclua chaves vazias antes da chamada — retire qualquer propriedade de expressão cujo valor seja uma string vazia/de espaços da requisição.
  3. Proteja seu builder — se a lista de condições está vazia, não anexe a expressão de forma alguma.
  4. Lembre-se de que são independentesExpressionAttributeNames/Values também devem ser omitidos (não {} referenciado por nada) quando não há expressão usando-os.
  5. Para uma leitura de tabela inteira, um Scan sem FilterExpression está correto — omita o parâmetro em vez de passar um vazio.

Prototipando consultas antes de conectá-las ao código? Rode-as no app desktop DynoTable — ele só envia os parâmetros de expressão que você de fato preenche, então você não vai enviar um filtro de string vazia.

Erros relacionados

Referências

Verificado pela última vez em 2026-07-13 contra a documentação oficial da AWS vinculada acima.

Trabalhe com o DynamoDB sem o Console

O DynoTable é um cliente desktop rápido para o DynamoDB — navegue pelas tabelas, execute consultas no estilo SQL e edite itens localmente.