它将控制权传递到下一个 匹配的 路由。例如,在您给出的示例中,您可能会在数据库中查找用户(如果
id给出了),然后将其分配给
req.user。
在下面,您可能会有一条类似的路线:
app.get('/users', function(req, res) { // check for and maybe do something with req.user});由于/ users / 123将首先匹配示例中的路由,因此将首先检查并找到user
123;然后
/users可以这样做的结果。
我认为,路由中间件是一种更灵活,功能更强大的工具,因为它不依赖于特定的URI方案或路由排序。我倾向于对这样显示的示例进行建模,假设
Users模型具有async
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);});能够像这样控制流量非常方便。您可能希望某些页面仅对带有admin标志的用户可用:
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');});希望这给您一些启发!



