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 tandoi
quandoI
seguidos ded
/_id$|Id$/
colocando o_
nos certificamos que somente id antecedido de _ será selecionado/_?id$/i
colocando o_?
dizermos que opcionalmente o _ antecedido deid
ouId
ouID
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