IMHO ist die akzeptierte Antwort auf diese Frage nicht wirklich richtig. Wie andere gesagt haben, geht es wirklich darum zu steuern, wann der nächste Handler in der Kette ausgeführt wird. Aber ich wollte etwas mehr Code bereitstellen, um ihn konkreter zu machen. Angenommen, Sie haben diese einfache Express-App:
var express = require('express');
var app = express();
app.get('/user/:id', function (req, res, next) {
console.log('before request handler');
next();
});
app.get('/user/:id', function (req, res, next) {
console.log('handling request');
res.sendStatus(200);
next();
});
app.get('/user/:id', function (req, res, next) {
console.log('after request handler');
next();
});
app.listen(3000, function () {
console.log('Example app listening on port 3000!')
});
Wenn Sie tun
curl http://localhost:3000/user/123
Sie sehen dies auf der Konsole gedruckt:
before request handler
handling request
after request handler
Wenn Sie nun den Aufruf an next()
den mittleren Handler wie folgt auskommentieren:
app.get('/user/:id', function (req, res, next) {
console.log('handling request');
res.sendStatus(200);
//next();
});
Sie sehen dies auf der Konsole:
before request handler
handling request
Beachten Sie, dass der letzte Handler (derjenige, der druckt after request handler
) nicht ausgeführt wird. Das liegt daran, dass Sie Express nicht mehr anweisen, den nächsten Handler auszuführen.
Es spielt also keine Rolle, ob Ihr "Haupt" -Handler (der 200 zurückgibt) erfolgreich war oder nicht. Wenn Sie möchten, dass der Rest der Middleware ausgeführt wird, müssen Sie anrufen next()
.
Wann würde sich das als nützlich erweisen? Angenommen, Sie möchten alle Anforderungen protokollieren, die in einer Datenbank eingegangen sind, unabhängig davon, ob die Anforderung erfolgreich war oder nicht.
app.get('/user/:id', function (req, res, next) {
try {
// ...
}
catch (ex) {
// ...
}
finally {
// go to the next handler regardless of what happened in this one
next();
}
});
app.get('/user/:id', function (req, res, next) {
logToDatabase(req);
next();
});
Wenn der zweite Handler ausgeführt werden soll, müssen Sie next()
den ersten Handler aufrufen .
Denken Sie daran, dass der Knoten asynchron ist, sodass er nicht wissen kann, wann der Rückruf des ersten Handlers beendet ist. Sie müssen es durch einen Anruf sagen next()
.