Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Ordem das rotas

Olá! Coloquei as rotas de pessoas nesta sequência:

router.get("/pessoas", (req, res) => pessoaController.pegaTodos(req, res));
router.get("/pessoas/:id", (req, res) => pessoaController.pegaUmPorId(req, res));
router.get("/pessoas/todos", (req, res) => pessoaController.pegaTodasAsPessoas(req, res));
// demais rotas

Então, ao acessar a rota http://localhost:3000/pessoas/todos com GET o Postman retornou:

{
    "erro": "SQLITE_ERROR: no such column: NaN"
}

Quando coloquei as rotas na mesma sequência que a professora indicou, aí funcionou certinho:

router.get("/pessoas", (req, res) => pessoaController.pegaTodos(req, res));
router.get("/pessoas/todos", (req, res) => pessoaController.pegaTodasAsPessoas(req, res));
router.get("/pessoas/:id", (req, res) => pessoaController.pegaUmPorId(req, res));
// demais rotas

Queria saber porque isso aconteceu. Os dois métodos não são GET? Então por que esse precisa vir primeiro?

2 respostas

Olá, Luís.

Tudo bem?

Isso acontece porque as rotas são avaliadas na ordem em que são definidas no código. Quando você define uma rota com um parâmetro dinâmico (:id), ela pode acabar "capturando" qualquer caminho que se encaixe nesse padrão, incluindo caminhos que você gostaria que fossem tratados por outras rotas mais específicas.

Por exemplo, quando você define a rota /pessoas/:id antes da rota /pessoas/todos, o Express tenta casar a URL /pessoas/todos com a rota /pessoas/:id, interpretando "todos" como um valor de id. Como "todos" não é um número, isso pode levar a erros como o que você viu (SQLITE_ERROR: no such column: NaN).

Quando você coloca a rota /pessoas/todos antes da rota /pessoas/:id, o Express primeiro verifica se a URL corresponde à rota mais específica (/pessoas/todos). Se não corresponder, ele então verifica a próxima rota (/pessoas/:id).

Aqui está um exemplo prático para ilustrar:

// Ordem correta
router.get("/pessoas", (req, res) => pessoaController.pegaTodos(req, res));
router.get("/pessoas/todos", (req, res) => pessoaController.pegaTodasAsPessoas(req, res));
router.get("/pessoas/:id", (req, res) => pessoaController.pegaUmPorId(req, res));
// demais rotas

Dessa forma, quando você acessa http://localhost:3000/pessoas/todos, o Express encontra a rota /pessoas/todos antes de tentar casar com /pessoas/:id.

Espero ter ajudado e bons estudos!

solução!

Caramba, tinha perdido um tempão pra achar esse bug, mas agora tudo ficou claro, valeu Renan!