Он передает управление к следующему соответствует маршрут. В примере, который вы указали, например, вы можете найти пользователя в базе данных, если дано id
, и назначьте его req.user
.
Ниже, вы могли бы иметь маршрут как:
app.get('/users', function(req, res) {
// check for and maybe do something with req.user
});
С/пользователями/123 будут соответствовать маршруту в вашем примере первого, который будет первой проверкой и найти пользователь 123
; то /users
может что-то сделать с результатом.
Route middleware (примечание: ссылка на документацию 2.x, но это проверено как работа на 3.x) является более гибким и мощным инструментом, хотя, на мой взгляд, поскольку он не полагается на конкретный URI или порядок маршрутизации. Я был бы склонен моделировать пример, показанный как это, предполагая Users
модели с асинхронным findOne()
:
function loadUser(req, res, next) {
if (req.params.userId) {
Users.findOne({ id: req.params.userId }, function(err, user) {
if (err) {
next(new Error("Couldn't find user: " + err));
return;
}
req.user = user;
next();
});
} else {
next();
}
}
// ...
app.get('/user/:userId', loadUser, function(req, res) {
// do something with req.user
});
app.get('/users/:userId?', loadUser, function(req, res) {
// if req.user was set, it's because userId was specified (and we found the user).
});
// Pretend there's a "loadItem()" which operates similarly, but with itemId.
app.get('/item/:itemId/addTo/:userId', loadItem, loadUser, function(req, res) {
req.user.items.append(req.item.name);
});
Будучи в состоянии контролировать поток, как это очень удобно. Вы могли бы хотеть иметь определенные страницы доступны только пользователь с флагом администратора:
/**
* Only allows the page to be accessed if the user is an admin.
* Requires use of `loadUser` middleware.
*/
function requireAdmin(req, res, next) {
if (!req.user || !req.user.admin) {
next(new Error("Permission denied."));
return;
}
next();
}
app.get('/top/secret', loadUser, requireAdmin, function(req, res) {
res.send('blahblahblah');
});
Надеется, что это дало вам вдохновение!
Далее просто разрешает следующий обработчик маршрута в очереди обрабатывать запрос. В этом случае, если идентификатор пользователя существует, он, скорее всего, будет использовать 'res.send' для завершения запроса. Если он не существует, вероятно, будет другой обработчик, который выдает ошибку и завершает запрос. –
, так что вы говорите, что у меня есть app.post ('/ login', function (req, res)) 'after' app.get ('/ users', function (req, res))' он вызовет логин являющийся следующим маршрутом в файле app.js, вызывая next()? – Menztrual
Нет, вы должны сослаться на эту часть документации Express.js: http://expressjs.com/guide.html#passing-route control –