2013-05-29 8 views
66

Scenariusz: Należy wziąć pod uwagę, że część kodu pochodzi z aplikacji sieciowej węzła.Kiedy używać następnej() i powrotu następnej() w pliku Node.js

app.get('/users/:id?', function(req, res, next){ 
    var id = req.params.id; 
    if (id) { 
     // do something 
    } else { 
     next(); //or return next(); 
    } 
}); 

Issue: Jestem sprawdzenie, który z nich pójść tylko z next() lub return next(). Powyższy przykładowy kod działa dokładnie tak samo, zarówno dla & nie wykazały żadnej różnicy w wykonaniu.

Pytanie: Może trochę światła postawić na to, kiedy użyć next() i kiedy używać return next() i jakąś istotną różnicę?

Odpowiedz

63

Niektórzy ludzie zawsze piszą return next(), aby upewnić się, że wykonanie zostanie zatrzymane po uruchomieniu wywołania zwrotnego.

Jeśli tego nie zrobisz, ryzykujesz wywołanie callbacku po raz drugi, co zwykle ma druzgocące wyniki. Kod jest w porządku, jak to jest, ale chciałbym przepisać jako:

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

    if(!id) 
     return next(); 

    // do something 
}); 

To oszczędza mi poziom wcięcia, a kiedy odczytać kodu ponownie później, jestem pewien, że nie ma sposobu next nazywa się dwa razy .

35

next() jest częścią connect middleware. Oddzwanianie do przepływu routera nie obchodzi, czy zwrócisz coś ze swoich funkcji, więc return next() i next(); return; jest w zasadzie taki sam.

W przypadku, gdy chcesz zatrzymać przepływ funkcji można użyć next(err) jak na poniższym

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'); 
    } 
); 

Prawie next() służy do przedłużenia middleware swoich żądań.

+0

Czy możemy wysłać parametr taki jak: 'next ('No ID')'? –

+5

'next ('No ID')' faktycznie wysyła błąd, który przerwie przepływ. – drinchev

+0

Użyj next (null, "somevalue"); Dla narzędzi takich jak async.waterfall przekaże wartość do następnej funkcji. Dla złożonych serii interakcji, które są oparte na danych, zwykle przekazuję obiekt kontekstowy między funkcjami. W ten sposób mogę tworzyć ogólne funkcje, które mogą być współużytkowane przez wiele punktów końcowych i kontrolować przepływ przez dane w kontekście –

28

Jak @Laurent Perrin odpowiedź:

Jeśli nie rób tego, istnieje ryzyko wywoływania zwrotnego po raz drugi później, co zwykle ma katastrofalne wyniki

podam przykład tutaj jeśli piszesz middleware tak:

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() 
}) 

Dowiesz się, że wyjście na konsolę jest:

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

Oznacza to, że uruchamia poniższy kod() po zakończeniu wszystkich funkcji oprogramowania pośredniego.

Jeśli jednak użyjesz , natychmiast wyskoczy z oddzwaniania, a kod poniżej return next() w oddzwonieniu będzie nieosiągalny.

+1

Jako początkujący wyraz "express" ta odpowiedź uczyniła rzeczy jaśniejszymi niż inne odpowiedzi. Kciuki w górę! – mandarin

Powiązane problemy