2
respostas

[Bug] Bug no regex que idenrifica se a propriedade possui

Nas aulas 3.7 , 3.8 e 3.9 foi apresentado a seguinte "solução" para converter params ID de texto para número.

module.exports = (objetoParams) => {
 for (let propriedade in objetoParams) {
   if (/Id|id/.test(propriedade)) {
     objetoParams[propriedade] = Number(objetoParams[propriedade]);
   }
 }
 return objetoParams;
};

O BUG acontece, pois esse regex tá buscando em toda a string, e não apenas no final (onde tem a flag _id ou Id)

Ou seja, se uma palavra tem "id" no meio ou no começo, vai atender o criterio desse if, quebrando a aplicação.

Sendo assim, se tivesse um atributo/linha/propriedade "ideia" do tipo texto, iria cair no if e tentar converter texto não enumerável em Number, quebrando a aplicação com um erro silencioso:

Converter texto em Number retorna NaN (Não é Número), sem cair em um catch, esse NaN seria empurrado para frente causando uma falha na listagem/edição/criação.

Para corrigir?

  • Podemos verificar se a conversão retornou Nulo, mas ainda teria o bug de converter o que não deveria.
if (/Id|id/.test(propriedade)) {
    const convertido = Number(objetoParams[propriedade]);
    objetoParams[propriedade] = Number.isNaN(convertido) ? objetoParams[propriedade] :  convertido;
}
  • O mais correto seria melhorar a busca com um $ que faz o regex buscar apenas no final da string
/Id$|id$/.test(propriedade)

da para escrever esse regex de diversas formas, com o mesmo resultado. Você pode ir testando de forma visual aqui https://regex101.com/

  • /id$/i o ì no final indica não sensível a maiúsculas e minusculas.
  • /[iI]d$/ os colchetes indicam que pode ser tando i quando I seguidos de d
  • /_id$|Id$/ colocando o _ nos certificamos que somente id antecedido de _ será selecionado
  • /_?id$/i colocando o _? dizermos que opcionalmente o _ antecedido de id ou Id ou ID será capturado e muitas outras combinações destes acima

No próximo post comento sobre não ser necessária essa conversão, pois não será realizado cálculos com esse Id

2 respostas

No próximo post comento sobre não ser necessária essa conversão, pois não será realizado cálculos com esse Id https://cursos.alura.com.br/forum/topico-sugestao-nao-e-necessario-converter-os-ids-de-req-params-de-string-para-number-452026

Olá, Luis! Tudo joia?

Você está correto em sua análise sobre o regex utilizado na função para converter os IDs de string para número. A expressão regular atual (/Id|id/) pode realmente causar problemas ao converter propriedades que contêm "id" em qualquer posição da string, como no exemplo que você deu com a palavra "ideia".

A solução que você apresentou é uma boa forma de contornar o problema que o regex utilizado pode causar. Então, lhe parabenizo pela iniciativa de buscar uma solução para essa situação e compartilhar ela aqui no fórum.

No mais, bons estudos!