1
resposta

sobre o next

ola,fiquei com uma duvida a repeito deste método, ele e aquele do padrão meedlewere correto?, se tudo estiver correto na requisição posso continuar avançando na aplicação, mas no caso mesmo contendo erro ele vai continuar, é isso? se sim , pq?

ail,senha,done) =>
    {
        const usuario = new UsuarioDao(db);
        usuario.buscaPorEmail(email)
            .then(user=>
                {
                    if(!user || user.senha != senha)
                    {
                        return done(null,false,
                            {
                                mensagem:'login e senha incorrretos'
                            })
                    }

                    return done(mull,true,user)
                })
                .catch(erro=>
                    {
                        return done(erro,false)
                    })
    }

no arquivo sesssao-autenticaçao e definido toda a configuraçao correto, eu vejo se existe o user na base , se as a senhas batem e etc, ate aqui tudo bem.

efetuaLogin() {

        return function(req, resp,next) {

            passport.authenticate('local',(erro,user,info)=>
            {
                if(info)
                {
                    return resp.marko(template.base.login)
                }

                if(erro)
                {
                    return next(erro)
                }

o problema foi quando chegou nesta parte, pelo que eu entendi o metodo authenticate utiliza todos as configuraçoes feitas anteriormente , ou seja , se foi declarada um msg de senha invalida e posso obter ela aqui, se usuario foi serealizado posso pegar ele, assim como o erro tbm, mas o instrutor informou que erro vai ser tratado no catch que foi definido la no outro arquivo, como assim? nao teria que ser tratado aqui? ja que o outro foi so arquivo de configuraçao.

grato

1 resposta

Olá Luan, tudo bem? Peço desculpas pela demora em ti responder! Mas vou tentar ti explicar o que acontece nesses trechos de código para que você possa entender corretamente:

Note que no método efetuaLogin do base-controlador.js:

efetuaLogin() {

        return function(req, resp, next) {

            // Lógica de login.
            const passport = req.passport;
            passport.authenticate('local', (erro, usuario, info) => {
                if (info) {
                    return resp.marko(templates.base.login);
                }

                if (erro) {
                    return next(erro);
                }

                req.login(usuario, (erro) => {
                    if (erro) {
                        return next(erro);
                    }

                    return resp.redirect(LivroControlador.rotas().lista);
                });
            })(req, resp, next);
        };
    }

Passamos os dados para o método do arquivo sessao-autenticacao.js que utiliza o new LocalStrategy:

passport.use(new LocalStrategy(
        {
            usernameField: 'email',
            passwordField: 'senha'
        },
        (email, senha, done) => {
            const usuarioDao = new UsuarioDao(db);
            usuarioDao.buscaPorEmail(email)
                        .then(usuario => {
                            if (!usuario || senha != usuario.senha) {
                                return done(null, false, {
                                    mensagem: 'Login e senha incorretos!'
                                });
                            }

                            return done(null, usuario);
                        })
                        .catch(erro => done(erro, false));
        }
    ));

E nesse método é que é feito as verificações, e caso tenha algum erro, entra no catch para em teoria tratar o erro, porém como você pode perceber:

.catch(erro => done(erro, false));

Apenas concluímos a execução desse método passando o erro, e assim vamos poder tratar o erro no local onde esse método foi chamado, que é no caso o método efetuaLogin(), então verificamos o erro:

if (erro) {
    return next(erro);
}

Assim, é possível termos o erro na tela de login para podermos exibir para o usuário.

Espero ter esclarecido sua dúvida!