Kiedy używać next () i zwracać next () w Node.js
Scenariusz : rozważ, że Poniżej znajduje się część kodu z aplikacji sieciowej węzła.
app.get('/users/:id?', function(req, res, next){
var id = req.params.id;
if (id) {
// do something
} else {
next(); //or return next();
}
});
Problem : sprawdzam, który wybrać właśnie next()
lub return next()
. Powyższy przykładowy kod działa dokładnie tak samo dla obu i nie wykazuje żadnej różnicy w wykonaniu.
Pytanie : czy ktoś może to rozjaśnić, kiedy używać next()
i kiedy używać return next()
i jakąś ważną różnicę?
3 answers
Niektórzy ludzie zawsze piszą return next()
, aby upewnić się, że wykonanie zatrzyma się po wywołaniu wywołania zwrotnego.
Jeśli tego nie zrobisz, ryzykujesz ponowne wywołanie zwrotne po raz drugi, co zwykle przynosi druzgocące rezultaty. Twój kod jest w porządku, ale przepisałbym go jako:
app.get('/users/:id?', function(req, res, next){
var id = req.params.id;
if(!id)
return next();
// do something
});
Zapisuje mi poziom wcięcia, a kiedy przeczytam kod ponownie później, jestem pewien, że nie ma możliwości, aby next
został wywołany dwa razy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-30 13:01:50
Jako odpowiedź @ Laurent Perrin:
Jeśli tego nie zrobisz, ryzykujesz ponowne wywołanie zwrotne po raz drugi, co zwykle przynosi niszczycielskie rezultaty
Podam tutaj przykład, jeśli napiszesz middleware w ten sposób:
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 w konsoli to:
This is a middleware
This is second middleware
This is third middleware
This is first-half middleware
To znaczy, że uruchamia poniższy kod next() po zakończeniu wszystkich funkcji middleware.
Jednak, jeśli użyjesz return next()
, natychmiast wyskoczy callback i Kod poniżej return next()
w wywołaniu zwrotnym będzie nieosiągalne.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-14 02:01:22
next()
jest częścią connect middleware. Wywołania zwrotne dla routera nie dbają o to, czy zwracasz coś z funkcji, więc return next()
i next(); return;
są zasadniczo takie same.
W przypadku, gdy chcesz zatrzymać przepływ funkcji, możesz użyć next(err)
Jak poniżej
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()
jest używany do rozszerzania oprogramowania pośredniczącego twoich żądań.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-01 10:07:14