Предположим, у вас есть простой блок кода, подобный этому:
app.get('/', function(req, res){
res.send('Hello World');
});
Эта функция имеет два параметра, req
и res
, которые представляют объекты запроса и ответа соответственно.
С другой стороны, есть другие функции с третьим параметром next
. Например, давайте посмотрим на следующий код:
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?
}
});
Я не могу понять, в чем смысл next()
или почему его используют. В этом примере, если id не существует, что на next
самом деле делает?
res.send
для завершения запроса. Если он не существует, вероятно, есть другой обработчик, который выдаст ошибку и завершит запрос.app.post('/login',function(req,res))
послеapp.get('/users',function(req,res))
того, как он вызовет вход в систему в качестве следующего маршрута в файле app.js, вызвав next ()?app.get("/users")
, то он будет запущен, если обработчик выше вызовов следующий.Ответы:
Он передает управление следующему подходящему маршруту. Например, в приведенном вами примере вы можете найти пользователя в базе данных, если он
id
указан, и назначить егоreq.user
.Ниже вы можете иметь маршрут как:
Так как / users / 123 сначала будет соответствовать маршруту в вашем примере, он сначала проверит и найдет пользователя
123
; затем/users
может сделать что-то с результатом этого.Промежуточное ПО для маршрутов является более гибким и мощным инструментом, хотя, на мой взгляд, поскольку оно не зависит от конкретной схемы URI или порядка маршрутов. Я был бы склонен смоделировать пример, показанный следующим образом, предполагая
Users
модель с асинхронностьюfindOne()
:Быть способным контролировать поток очень удобно. Возможно, вы захотите, чтобы определенные страницы были доступны только пользователям с флагом администратора:
Надеюсь, это вдохновило вас!
источник
next()
снова. Было бы то же самое, если бы я просто использовалnext(new Error(…)); return;
.next(new Error(…)); return;
. Если мы передаем значениеnext
, это в одностороннем порядке считается ошибкой . Я не слишком много заглядывал в экспресс-код, но покопайтесь, и вы найдете то, что вам нужно :)return next(…);
наnext(…); return;
так, что это менее запутанно.)У меня также были проблемы с пониманием next (), но это помогло
источник
.get
называется, а не второй?Перед тем, как понять
next
, вам необходимо иметь представление о цикле «запрос-ответ» в узле, хотя и не очень подробно. Он начинается с того, что вы делаете HTTP-запрос для определенного ресурса, и заканчивается, когда вы отправляете ответ обратно пользователю, т.е. когда вы сталкиваетесь с чем-то вроде res.send ('Hello World');давайте посмотрим на очень простой пример.
Здесь нам не нужна функция next (), так как resp.send завершит цикл и вернет управление обратно промежуточному программному обеспечению маршрута.
Теперь давайте посмотрим на другой пример.
Здесь у нас есть 2 функции промежуточного программного обеспечения для одного и того же пути. Но вы всегда получите ответ от первого. Потому что он монтируется первым в стеке промежуточного программного обеспечения, а res.send завершит цикл.
Но что, если мы всегда не хотим «Hello World !!!!» ответ обратно. Для некоторых условий мы можем хотеть "Привет Планета !!!!" ответ. Давайте изменим приведенный выше код и посмотрим, что произойдет.
Что
next
здесь происходит? И да, у тебя могут быть подкрепления. Он пропустит первую функцию промежуточного программного обеспечения, если условие выполнено, и вызовет следующую функцию промежуточного программного обеспечения, и вы получите"Hello Planet !!!!"
ответ.Итак, next передает управление следующей функции в стеке промежуточного программного обеспечения.
Что если первая функция промежуточного программного обеспечения не отправляет ответ, но выполняет часть логики, а затем вы получаете ответ от второй функции промежуточного программного обеспечения.
Что-то вроде ниже: -
В этом случае вам нужны обе функции промежуточного программного обеспечения. Таким образом, единственный способ получить доступ ко второй функции промежуточного программного обеспечения - это вызвать next ();
источник
next()
работает какgoto
с жесткой этикеткой? То есть в вашем третьем фрагменте, когда вы позвонитеnext()
,res.send("Hello World !!!!");
никогда не будет выполнен? Я заметил, что у @Ashe всегда были вызовыreturn;
послеnext
, у которых был код в одном и том же дереве выполнения ... Думаю, я всегда мог просто проверить экспресс, да? / переходит к своему текстовому редактору;)next()
вызова вызывается . В этом случаеpast the next() call
записывается на консоль, и тогда я получаю сообщениеError: Can't set headers after they are sent.
об ошибке, как второйres.send
называется, хотя и безуспешно. Поток кода возвращается послеnext()
вызова, что делаетreturns
важным @ Ashe (или другое логическое управление).next()
чтобы пропустить выполнение остальных операторов. спасибо за указание на это.Next используется для передачи управления следующей функции промежуточного программного обеспечения. Если нет, то запрос будет оставлен висеть или открыт.
источник
Вызов этой функции вызывает следующую функцию промежуточного программного обеспечения в приложении. Функция next () не является частью Node.js или Express API, но является третьим аргументом, который передается в функцию промежуточного программного обеспечения. Функция next () может быть названа как угодно, но по соглашению она всегда называется «next».
источник
Выполнение
next
функции уведомляет сервер о том, что вы завершили этот шаг промежуточного программного обеспечения, и может выполнить следующий шаг в цепочке.источник