Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Validação de login em API

Estou trabalhando num sisteminha pra controlar o horário de alimentação dos meus doguinhos, apenas para estudo, entretanto estou tendo um pequeno problema com o sistema de login, apesar dele verificar se o usuário está logado e proteger os recursos, quando envio uma requisição sem o header "auth" com o JWT, além dele mandar a response com o status 401 de não autorizado, ele também tenta mandar a response com status 500, o que imprime um erro no console. A aplicação funciona normalmente, mas gostaria de remover esse erro de alguma forma.

Esse é o método que valida o login, caso o token não seja enviado ela responde a requisição com um 401.

    static async verifyLogin(req, res){
        try{
            const decoded = await JwtHelper.verifyJwt(req.headers.auth);
            return decoded;
        }catch(error){
            res.status(401).send({ error: "Efetue o login antes de prosseguir." });
        }
    }

Esse é um exemplo de método do controler.

    async getAll(req, res){
        try {
            const loginData = await LoginHelper.verifyLogin(req, res);
            const ownerId = loginData.user.id;
            let dogs =  await this._dogDao.findAll({ ownerId });
            dogs = ListHelper.createListCheckingActive(dogs, DogFactory.createFromMongo);
            res.status(200).send(dogs); 
        }catch(error){
            res.status(500).send({ error: "Não foi possível carregar os cachorros."})   
        }
    }

Gostaria de saber alguma forma de contornar essa situação, se há como, por exemplo, o erro só cair no "catch" do verificador de login e o método no qual ele é utilizado simplemente parar a execução quando ele ocorre.

2 respostas
solução

Tente fazer da seguinte forma, altera a sua função "verifyLogin" para retornar um objeto contendo se houve ou não sucesso na validação do "auth". Na função "getAll", faça a implementação dos retornos (200, 404, 500).

A função "verifyLogin" ficaria da seguinte forma:

static async verifyLogin(req, res){
    let retorno = {}
    try{
        const decoded = await JwtHelper.verifyJwt(req.headers.auth);
        retorno.erro = false;
        retorno.dados = decoded;
    }catch(error){
        retorno.erro = true;
    }
    return retorno;
}

A função "getAll" ficaria assim:

async getAll(req, res){

        const loginData = await LoginHelper.verifyLogin(req, res);
        if (loginData.error){
            res.status(401).send({ error: "Efetue o login antes de prosseguir." });
        } else {
             try {
                const ownerId = loginData.dados.user.id;
                let dogs =  await this._dogDao.findAll({ ownerId });
                dogs = ListHelper.createListCheckingActive(dogs, DogFactory.createFromMongo);
                res.status(200).send(dogs); 
            } catch(error){
                res.status(500).send({ error: "Não foi possível carregar os cachorros."})   
            }
        }
    }

Obrigado =)