2015-11-10 9 views
5

https://github.com/hwz/chirp/blob/master/module-5/completed/routes/api.jspowrócić next() w nodejs zamieszania

function isAuthenticated (req, res, next) { 
    // if user is authenticated in the session, call the next() to call the next request handler 
    // Passport adds this method to request object. A middleware is allowed to add properties to 
    // request and response objects 

    //allow all get request methods 
    if(req.method === "GET"){ 
     return next(); 
    } 
    if (req.isAuthenticated()){ 
     return next(); 
    } 

    // if the user is not authenticated then redirect him to the login page 
    return res.redirect('/#login'); 
}; 

Dlaczego autor zrobić return next() zamiast next()? Wiem, że next() to pozwolić przepływowi przejść do następnego oprogramowania pośredniego lub funkcji, ale dlaczego potrzebuje on return dla next() powyżej?

+0

Tak więc 'jestAuthenticated' zwraca wszystko, co' next() 'zwraca. To może nie być przydatna wartość, zwróćcie uwagę. –

+2

możliwy duplikat http://stackoverflow.com/questions/16810449/when-to-use-next-and-return-next-in-node-js, ale jest prawidłowe i dobre pytanie –

+0

W kontekście ekspresowych artykułów średnich jej zatrzymanie wykonywania tego konkretnego elementu middle-ware powinno się do jednej z tych instrukcji if. Wywołanie 'next' mówi express 'im done here move on', jednak bez' return' może wywołać 'next', ale spróbuj także wykonać przekierowanie. – ste2425

Odpowiedz

1

Konwencja ma na celu dodanie return do wyjścia z funkcji. Alternatywą byłoby użycie if-else if-else zamiast tylko if. W tym przypadku wystarczy wyjść z funkcji i krok dalej w łańcuchu oprogramowania pośredniego.

Ten wzór będzie dostępny dość często. Na przykład, jest to dość powszechne:

someFunction(function(err, result) { 
    if (err) { 
     return console.error(err); 
    } 

    console.log(result); 
}); 

To mniej gniazdowania i czyta łatwiej większości ludzie ciężko w porównaniu do tego:

someFunction(function(err, result) { 
    if (err) { 
     console.error(err); 
    } else { 
     console.log(result); 
    } 
}); 

Pierwszy wzór trzyma cię również przed przypadkowym wywołaniem next() dwukrotnie lub nawet więcej razy na wypadek, gdyby pojawił się błąd w twojej metodzie if-else. I to jest dokładnie to, co nie powinno się zdarzyć z next() w tym przypadku, który wysłałeś. Może wywołać next() i nadal powodować przekierowanie w każdym przypadku.

+0

czy to odpowiada na pytanie? Wiem, co robi next(), ale po co wracać dalej(), to jest moje pytanie: –

+0

Dokładnie to wyjaśniałem w mojej odpowiedzi, tak. Chodzi tylko o wyjście z tej metody, aby uniknąć dalszych połączeń. To wzór. Nie ma to nic wspólnego z 'next()' naprawdę. To głównie dlatego, że natura piekielnego piekła. –