Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Aula 156 - Editando contatos (update) #76

Open
devDudu-21 opened this issue Nov 7, 2023 · 1 comment
Open

Aula 156 - Editando contatos (update) #76

devDudu-21 opened this issue Nov 7, 2023 · 1 comment

Comments

@devDudu-21
Copy link

O código da aula 156 apresenta o seguinte erro:

/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.

Register:

exports.register = async (req, res) => {
    try {
        const contato = new Contato(req.body);
        await contato.register();

        if (contato.errors.length > 0) {
            req.flash('errors', contato.errors);
            req.session.save(() => res.redirect('/contato'));
            return;
        }

        req.flash('success', 'Contato registrado com sucesso.');
    } catch (e) {
        console.log(e);
        req.flash('errors', ['Erro interno no servidor.']);
    }

    req.session.save(() => res.redirect('/contato'));

};

Edit:

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.

@devDudu-21
Copy link
Author

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.

exports.register = async (req, res) => {
    try {
        const contato = new Contato(req.body);
        await contato.register();

        if (contato.errors.length > 0) {
            req.flash('errors', contato.errors);
            req.session.save(() => res.redirect('/contato'));
            return;
        }

        req.flash('success', 'Contato registrado com sucesso.');
        req.session.save(() => res.redirect(`/contato/${contato.contato._id}`));
        return;
    } catch (e) {
        console.log(e);
        return res.render('404');
    }
};

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant