Suponha que você tenha um bloco de código simples como este:
app.get('/', function(req, res){
res.send('Hello World');
});
Essa função possui dois parâmetros, req
e res
, que representam os objetos de solicitação e resposta, respectivamente.
Por outro lado, existem outras funções com um terceiro parâmetro chamado next
. Por exemplo, vamos dar uma olhada no seguinte código:
app.get('/users/:id?', function(req, res, next){ // Why do we need next?
var id = req.params.id;
if (id) {
// do something
} else {
next(); // What is this doing?
}
});
Não consigo entender qual é o objetivo next()
ou por que está sendo usado. Nesse exemplo, se o ID não existir, o que next
realmente está fazendo?
res.send
para concluir a solicitação. Se não existir, provavelmente existe outro manipulador que emitirá um erro e concluirá a solicitação.app.post('/login',function(req,res))
depoisapp.get('/users',function(req,res))
que ele chamará o login como a próxima rota no arquivo app.js chamando next ()?app.get("/users")
, será executada se o manipulador acima chamar em seguida.Respostas:
Passa o controle para a próxima rota correspondente . No exemplo que você fornece, por exemplo, você pode procurar o usuário no banco de dados se um
id
foi fornecido e atribuí-lo areq.user
.Abaixo, você pode ter uma rota como:
Como / users / 123 corresponderá primeiro à rota no seu exemplo, que primeiro verificará e encontrará o usuário
123
; então/users
pode fazer algo com o resultado disso.O middleware de rota é uma ferramenta mais flexível e poderosa, no entanto, na minha opinião, uma vez que não depende de um esquema URI ou de um pedido de rota específico. Eu estaria inclinado a modelar o exemplo mostrado assim, assumindo um
Users
modelo com uma assíncronafindOne()
:Ser capaz de controlar o fluxo dessa maneira é bastante útil. Você pode querer que determinadas páginas estejam disponíveis apenas para usuários com um sinalizador de administrador:
Espero que isso tenha lhe dado alguma inspiração!
fonte
next()
novamente. Seria o mesmo se eu apenas usassenext(new Error(…)); return;
.next(new Error(…)); return;
. Se passarmos um valor paranext
, é considerado unilateralmente um erro . Eu não olhei para o código expressa muito, mas cavar em volta e você vai encontrar o que você precisa :)return next(…);
paranext(…); return;
por isso é menos confuso.)Eu também tive problemas para entender next (), mas isso ajudou
fonte
.get
seja chamado e não o segundo?Antes de entender
next
, você precisa ter uma pequena idéia do ciclo de solicitação-resposta no nó, embora não muito detalhadamente. Começa com você solicitando HTTP para um recurso específico e termina quando você envia uma resposta de volta ao usuário, ou seja, quando você encontra algo como res.send ('Hello World');vamos dar uma olhada em um exemplo muito simples.
Aqui não precisamos de next (), porque resp.send encerrará o ciclo e entregará o controle de volta ao middleware da rota.
Agora vamos dar uma olhada em outro exemplo.
Aqui temos duas funções de middleware para o mesmo caminho. Mas você sempre obterá a resposta do primeiro. Porque isso é montado primeiro na pilha de middleware e o res.send encerrará o ciclo.
Mas e se nem sempre queremos o "Olá Mundo !!!!" resposta de volta. Para algumas condições, podemos querer o "Olá Planeta !!!!" resposta. Vamos modificar o código acima e ver o que acontece.
O que está
next
fazendo aqui. E sim, você pode ter gusses. Irá pular a primeira função do middleware se a condição for verdadeira e chamar a próxima função do middleware e você terá a"Hello Planet !!!!"
resposta.Portanto, passe o controle para a próxima função na pilha de middleware.
E se a primeira função de middleware não enviar nenhuma resposta, mas executar uma parte da lógica e você receber a resposta da segunda função de middleware.
Algo como abaixo: -
Nesse caso, você precisa que ambas as funções do middleware sejam invocadas. Portanto, a única maneira de alcançar a segunda função do middleware é chamando next ();
fonte
next()
funciona como umgoto
com uma etiqueta com fio? Ou seja, no seu terceiro trecho, uma vez que você ligarnext()
,res.send("Hello World !!!!");
nunca seria executado? Percebi que o @Ashe sempre teve chamadasreturn;
após onext
código na mesma árvore de execução ... Acho que eu sempre podia fazer check-in expresso, não é? / corre para o seu editor de texto;)next()
chamada ser chamada . Nesse caso, elepast the next() call
é gravado no console e, em seguida, recebo umError: Can't set headers after they are sent.
erro, como o segundores.send
é chamado, embora sem êxito. O fluxo de código retorna após anext()
chamada, o que torna importante o @ Ashereturns
(ou outro gerenciamento lógico).next()
para ignorar a execução das instruções restantes. obrigado por apontar isso.Next é usado para passar o controle para a próxima função de middleware. Caso contrário, a solicitação será deixada suspensa ou aberta.
fonte
A chamada dessa função chama a próxima função de middleware no aplicativo. A função next () não faz parte da API Node.js ou Express, mas é o terceiro argumento que é passado para a função middleware. A função next () pode ter o nome de qualquer coisa, mas por convenção é sempre chamada de "next".
fonte
A execução da
next
função notifica o servidor que você concluiu esta etapa do middleware e ela pode executar a próxima etapa da cadeia.fonte