它将控制权转移到下一条matching路由.例如,在您给出的示例中,如果给定了id
,您可能会在数据库中查找用户,并将其分配给req.user
.
在下面,你可以 Select 这样的路由:
app.get('/users', function(req, res) {
// check for and maybe do something with req.user
});
由于/users/123将首先匹配示例中的路由,因此将首先判断并查找用户123
;然后/users
可以用这个结果做点什么.
不过,在我看来,Route middleware是一个更灵活、更强大的工具,因为它不依赖于特定的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');
});
希望这能给你一些启发!