You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
/home/devdudu/GitHub/projetoAgenda/src/controllers/contatoController.js:47
req.session.save(() => res.redirect(`/contato/${contato.contato._id}`));
^
TypeError: Cannot read properties of null (reading '_id')
at /home/devdudu/GitHub/projetoAgenda/src/controllers/contatoController.js:47:77
at /home/devdudu/GitHub/projetoAgenda/node_modules/connect-mongo/build/main/lib/MongoStore.js:291:20
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Node.js v18.18.0
Fazendo algumas alterações de lógica das funções register e edit que estão no contatoController, é possível solucionar esse erro, como fiz no código abaixo.
exports.edit = async function (req, res) {
try {
if (!req.params.id) return res.render('404');
const contato = new Contato(req.body);
await contato.edit(req.params.id);
if (contato.errors.length > 0) {
req.flash('errors', contato.errors);
req.session.save(() => res.redirect(`/contato/${req.params.id}`)); // Usar req.params.id
return;
}
req.flash('success', 'Contato editado com sucesso.');
} catch (error) {
console.log(error);
req.flash('errors', ['Erro interno no servidor.']);
}
req.session.save(() => res.redirect(`/contato/${req.params.id}`)); // Usar req.params.id
};
Basicamente, o problema ocorreu pois no código original as funções estavam tentando acessar contato.contato._id mesmo após a verificação de erros (if (contato.errors.length > 0)). Quando ocorria um erro, o objeto contato ainda era acessado, o que causava o erro "Cannot read properties of null (reading '_id')".
A solução que propus envolve o seguinte raciocínio:
Se houver erros na validação do objeto contato, não faz sentido tentar acessar o _id do objeto, pois ele não foi criado ou atualizado com sucesso no banco de dados.
Portanto, a modificação principal foi reorganizar a lógica para que o redirecionamento seja realizado no final do bloco, após a verificação de erros. Dessa forma, o objeto contato não é acessado quando ocorrem erros.
No método register:
Após a tentativa de registro (await contato.register()), verificamos se há erros em contato.
Se houver erros, configuramos as mensagens de erro (req.flash) e redirecionamos para a página de contato imediatamente. Não acessamos contato.contato._id nesta situação.
Se não houver erros, configuramos uma mensagem de sucesso (req.flash) e, em seguida, redirecionamos para a página de contato.
No método edit:
Após a tentativa de edição (await contato.edit(req.params.id)), verificamos se há erros em contato.
Se houver erros, configuramos as mensagens de erro (req.flash) e redirecionamos para a página de contato com o req.params.id original, não acessando contato.contato._id nesta situação.
Se não houver erros, configuramos uma mensagem de sucesso (req.flash) e, em seguida, redirecionamos para a página de contato com o req.params.id original.
Essas modificações garantem que o código não tente acessar propriedades de um objeto contato que pode estar incompleto ou nulo devido a erros e, ao mesmo tempo, fornece uma mensagem de sucesso ou erro apropriada para o usuário. Isso ajuda a evitar exceções inesperadas e mantém o comportamento da aplicação mais previsível.
The text was updated successfully, but these errors were encountered:
Fiz mais alguns testes e descobri um bug na função register que eu fiz, além de perder um pouco da proposta de aplicação feita na aula, desta forma, convém manter a função register da forma original.
O código da aula 156 apresenta o seguinte erro:
Fazendo algumas alterações de lógica das funções register e edit que estão no contatoController, é possível solucionar esse erro, como fiz no código abaixo.
Register:
Edit:
Basicamente, o problema ocorreu pois no código original as funções estavam tentando acessar
contato.contato._id
mesmo após a verificação de erros(if (contato.errors.length > 0))
. Quando ocorria um erro, o objeto contato ainda era acessado, o que causava o erro"Cannot read properties of null (reading '_id')"
.A solução que propus envolve o seguinte raciocínio:
Se houver erros na validação do objeto contato, não faz sentido tentar acessar o _id do objeto, pois ele não foi criado ou atualizado com sucesso no banco de dados.
Portanto, a modificação principal foi reorganizar a lógica para que o redirecionamento seja realizado no final do bloco, após a verificação de erros. Dessa forma, o objeto contato não é acessado quando ocorrem erros.
No método register:
Após a tentativa de registro (await contato.register()), verificamos se há erros em contato.
Se houver erros, configuramos as mensagens de erro (req.flash) e redirecionamos para a página de contato imediatamente. Não acessamos contato.contato._id nesta situação.
Se não houver erros, configuramos uma mensagem de sucesso (req.flash) e, em seguida, redirecionamos para a página de contato.
No método edit:
Após a tentativa de edição (await contato.edit(req.params.id)), verificamos se há erros em contato.
Se houver erros, configuramos as mensagens de erro (req.flash) e redirecionamos para a página de contato com o req.params.id original, não acessando contato.contato._id nesta situação.
Se não houver erros, configuramos uma mensagem de sucesso (req.flash) e, em seguida, redirecionamos para a página de contato com o req.params.id original.
Essas modificações garantem que o código não tente acessar propriedades de um objeto contato que pode estar incompleto ou nulo devido a erros e, ao mesmo tempo, fornece uma mensagem de sucesso ou erro apropriada para o usuário. Isso ajuda a evitar exceções inesperadas e mantém o comportamento da aplicação mais previsível.
The text was updated successfully, but these errors were encountered: