Вопрос по express, connect, v8, node.js – Когда использовать next () и возвращать next () в Node.js

90

сценарийРассмотрим следующую часть кода из веб-приложения узла.

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() а какая важная разница?

Ваш Ответ

3   ответа
98

Некоторые люди всегда пишутreturn next() должен гарантировать, что выполнение останавливается после запуска обратного вызова.

Если вы неТаким образом, вы рискуете вызвать обратный вызов во второй раз, что обычно приводит к разрушительным результатам. Ваш код в порядке, но я бы переписал его так:

app.get('/users/:id?', function(req, res, next){
    var id = req.params.id;

    if(!id)
        return next();

    // do something
});

Это спасает меня от уровня отступов, и когда я снова читаю код позже, яя уверен, что нет путиnext называется дважды.

Будет ли похожая вещь правдойres.redirect('/') противreturn res.redirect('/') в такой ситуации? Может быть это'просто лучше всегда писать return перед операторами res, чтобы избежать ошибок установки заголовков после их отправки? Adam D
42

next() это частьподключите промежуточное ПО, Обратные вызовы для потока маршрутизатора нене волнует, если вы что-то возвращаете из своих функций, такreturn next() а такжеnext(); return; в основном то же самое.

Если вы хотите остановить поток функций, вы можете использоватьnext(err) как следующее

app.get('/user/:id?', 
    function(req, res, next) { 
        console.log('function one');
        if ( !req.params.id ) 
            next('No ID'); // This will return error
        else   
            next(); // This will continue to function 2
    },
    function(req, res) { 
        console.log('function two'); 
    }
);

Довольно многоnext() используется для расширения промежуточного программного обеспечения ваших запросов.

Но я признаю, что контекст здесь немного другой. Но, тем не менее, если вы ожидаете (или генерируете ошибку) несколько ошибок в асинхронном промежуточном программном обеспечении, вы должны 'вернуться дальше (е) ' Nickolodeon
next('No ID') на самом деле отправляет ошибку, которая нарушит поток. drinchev
Используйте следующий (ноль, "SomeValue»); Для таких инструментов, как async.waterfall, оно передаст значение следующей функции. Для сложных серий взаимодействий, управляемых данными, я обычно передаю объект контекста между функциями. Таким образом, я могу создавать общие функции, которые могут совместно использоваться несколькими конечными точками, и управлять потоком данных через контекст ». Chad Wilson
Я наблюдаю обратное (при возникновении ошибки): next (ошибка) запускает следующее промежуточное ПО, но продолжает выполнять код; return next (error) просто передает выполнение следующему промежуточному программному обеспечению. next (e) и return next (e) НЕ одинаковы. Nickolodeon
91

Как @Laurent Perrin 'ответ:

Если вы неЕсли вы сделаете это, вы рискуете вызвать обратный вызов во второй раз, что обычно приводит к разрушительным результатам.

Я приведу пример, если вы напишите промежуточное программное обеспечение следующим образом:

app.use((req, res, next) => {
  console.log('This is a middleware')
  next()
  console.log('This is first-half middleware')
})

app.use((req, res, next) => {
  console.log('This is second middleware')
  next()
})

app.use((req, res, next) => {
  console.log('This is third middleware')
  next()
})

Вы обнаружите, что вывод в консоли:

This is a middleware
This is second middleware
This is third middleware
This is first-half middleware

То есть он выполняет код ниже next () после завершения всех функций промежуточного программного обеспечения.

Однако, если вы используетеreturn next(), он немедленно выскочит обратный вызов и код нижеreturn next() в обратном вызове будет недоступен.

Будет ли похожая вещь правдойres.redirect('/') противreturn res.redirect('/') в такой ситуации? Может быть это'просто лучше всегда писатьreturn передres заявления, чтобы избежать ошибок установки заголовков после их отправки? Adam D
Как начинающийexpress этот ответ прояснил мне вещи, чем другие ответы. Пальцы вверх! mandarin

Похожие вопросы