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$/ioìno final indica não sensível a maiúsculas e minusculas./[iI]d$/os colchetes indicam que pode ser tandoiquandoIseguidos ded/_id$|Id$/colocando o_nos certificamos que somente id antecedido de _ será selecionado/_?id$/icolocando o_?dizermos que opcionalmente o _ antecedido deidouIdouIDserá 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