Сценарий : рассмотрим следующую часть кода веб-приложения узла.
app.get('/users/:id?', function(req, res, next){
var id = req.params.id;
if (id) {
// do something
} else {
next(); //or return next();
}
});
Проблема : я проверяю, какой из них использовать, просто next()
или return next()
. Приведенный выше пример кода работает одинаково для обоих и не показывает никакой разницы в исполнении.
Вопрос : Кто-нибудь может пролить свет на это, когда использовать, next()
а когда использовать, return next()
и какое-то важное различие?
res.redirect('/')
vs.return res.redirect('/')
в подобной ситуации? Может, лучше всегда писать return перед операторами res, чтобы избежать ошибок установки заголовков после их отправки?Как ответил @Laurent Perrin:
Я приведу здесь пример, если вы напишете промежуточное ПО следующим образом:
Вы обнаружите, что вывод в консоли:
То есть он запускает приведенный ниже код next () после завершения всех функций промежуточного программного обеспечения.
Однако, если вы используете
return next()
, он сразу же выйдет из обратного вызова, и код нижеreturn next()
в обратном вызове будет недоступен.источник
express
этот ответ прояснил мне ситуацию, чем другие ответы. Недурно!res.redirect('/')
vs.return res.redirect('/')
в подобной ситуации? Может просто лучше всегда писатьreturn
передres
операторами, чтобы избежать ошибок установки заголовков после их отправки?next()
является частью промежуточного программного обеспечения Connect . Обратным вызовам для потока маршрутизатора все равно, вернете ли вы что-нибудь из своих функций, поэтомуreturn next()
иnext(); return;
в основном то же самое.Если вы хотите остановить поток функций, вы можете использовать
next(err)
следующееВ значительной степени
next()
используется для расширения промежуточного программного обеспечения ваших запросов.источник
next('No ID')
:?next('No ID')
фактически отправляет ошибку, которая прерывает поток.Лучше вообще не использовать! Я объясняю, и это то, что я тоже объясняю.
Функция next (), которая может иметь любое имя и по соглашению установлена на next. Это косвенно связано с операциями (PUT, GET, DELETE, ...), которые обычно выполняются на одном и том же ресурсе URI, например
/ user /: id
Теперь, если вы посмотрите на app.get, app.put и app.delete используют один и тот же uri (/ user /: id), единственное, что их отличает, - это их реализация. Когда запрос сделан (req), express сначала помещает req в app.get, если какая-либо проверка, которую вы создали, потому что этот запрос не для этого контроллера, терпит неудачу, он передает req в app.put, который является следующим маршрутом в файле te, и поэтому на. Как видно из приведенного ниже примера.
Проблема заключается в том, что в конце концов вы передаете req всем контроллерам, надеясь, что есть тот, который делает то, что вы хотите, посредством проверки req. В конце концов, все контроллеры получают то, что им не подходит :(.
Итак, как избежать проблемы с next () ?
Ответ действительно прост.
1- должен быть только один uri для идентификации ресурса
http: // IpServidor / colection /: resource / colection /: resource, если ваш URI длиннее этого, вам следует подумать о создании нового uri
Пример http: // IpServidor / users / pepe / contacts / contacto1
2-Все операции с этим ресурсом должны выполняться с соблюдением идемпотентности глаголов http (get, post, put, delete, ...), поэтому вызов URI действительно имеет только один способ вызова
Дополнительная информация [ https://docs.microsoft.com/es-es/azure/architecture/best-practices/api-design#organize-the-api-around-resources visible [1 ]
Посмотрим код! Конкретная реализация, которая заставляет нас избегать использования next ()!
В файле index.js
В файле usersRoute.js
Теперь файл usersRoute.js выполняет то, что должен делать файл с именем usersRoute, а именно управлять маршрутами URI / users /
// файл getUsersController.js
Таким образом, вы избегаете использования next, вы разделяете код, вы повышаете производительность, вы разрабатываете SOLID, вы оставляете дверь открытой для возможного перехода на микросервисы и, прежде всего, его легко читать программисту.
источник
Следующий() :
источник