Cenário : considere o seguinte é a parte do código de um aplicativo da web do nó.
app.get('/users/:id?', function(req, res, next){
var id = req.params.id;
if (id) {
// do something
} else {
next(); //or return next();
}
});
Problema : estou verificando qual deles deve ser usado com apenas next()
ou return next()
. O código de exemplo acima funciona exatamente da mesma forma para os dois e não mostrou nenhuma diferença na execução.
Pergunta : Alguém pode esclarecer isso, quando usar next()
e quando usar return next()
e alguma diferença importante?
res.redirect('/')
vs.return res.redirect('/')
neste tipo de situação? Talvez seja melhor sempre escrever retorno na frente de instruções res para evitar erros na definição de cabeçalhos após o envio?Como resposta de @Laurent Perrin:
Eu dou um exemplo aqui se você escrever middleware como este:
Você descobrirá que a saída no console é:
Ou seja, ele executa o código abaixo next () após a conclusão de todas as funções do middleware.
No entanto, se você usar
return next()
, ele retornará o retorno de chamada imediatamente e o código abaixoreturn next()
no retorno de chamada estará inacessível.fonte
express
nessa resposta, as coisas ficaram mais claras para mim do que as outras respostas. Afirmativo!res.redirect('/')
vs.return res.redirect('/')
neste tipo de situação? Talvez seja melhor sempre escreverreturn
na frente dasres
instruções para evitar erros na definição dos cabeçalhos após o envio?next()
faz parte do connect middleware . Faz chamadas de retorno para o fluxo de router não me importo se você retornar qualquer coisa de suas funções, de modoreturn next()
enext(); return;
é basicamente o mesmo.Caso queira interromper o fluxo de funções, você pode usar
next(err)
como o seguintePraticamente
next()
é usado para estender o middleware de suas solicitações.fonte
next('No ID')
:?next('No ID')
está realmente enviando um erro, o que interromperá o fluxo.É melhor não usá-lo! Eu explico, e é isso que eu também explico.
A função next () que pode ter qualquer nome e por convenção foi definida como next. Está indiretamente relacionado às operações (PUT, GET, DELETE, ...) geralmente executadas no mesmo recurso URI, por exemplo
/ user /: id
Agora, se você olhar para app.get, app.put e app.delete, use a mesma uri (/ user /: id), a única coisa que os diferencia é sua implementação. Quando a solicitação é feita (req) express, a primeira é solicitada em app.get, se alguma validação criada porque essa solicitação não é para o controlador falhar, ela passa a req para app.put, que é a próxima rota no arquivo te e, portanto, em. Como visto no exemplo abaixo.
O problema é que, no final, você acaba passando a requisição para todos os controladores, esperando que exista uma que faça o que você deseja, através da validação da requisição. No final, todos os controladores acabam recebendo algo que não é para eles :(.
Então, como evitar o problema de next () ?
A resposta é realmente simples.
1- deve haver apenas uma uri para identificar um recurso
http: // IpServidor / colection /: resource / colection /: resource se o seu URI for maior que isso, considere criar um novo URL
Exemplo http: // IpServidor / users / pepe / Contacts / contacto1
2-Todas as operações neste recurso devem ser feitas respeitando a idempotência dos verbos http (get, post, put, delete, ...) para que a chamada para um URI realmente tenha apenas uma maneira de chamar
Mais informações [ https://docs.microsoft.com/es-es/azure/architecture/best-practices/api-design#organize-the-api-around-resources[[1]
Vamos ver o código!A implementação concreta que nos faz evitar o uso de next ()!
No arquivo index.js
No arquivo usersRoute.js
Agora, o arquivo usersRoute.js faz o que um arquivo chamado usersRoute deve fazer, que é gerenciar as rotas do URI / users /
// arquivo getUsersController.js
Dessa forma, evita-se o uso do próximo, você dissocia o código, obtém desempenho, desenvolve o SOLID, deixa a porta aberta para uma possível migração para microsserviços e, acima de tudo, é fácil de ler por um programador.
fonte
Próximo() :
fonte