Page 103 - Node.js开发指南
P. 103
96 第 5 章 使用 Node.js 进行 Web 开发
但当你访问任何被这两条同样的规则匹配到的路径时,会发现请求总是被前一条路由规
则捕获,后面的规则会被忽略。原因是 Express 在处理路由规则时,会优先匹配先定义的路
由规则,因此后面相同的规则被屏蔽。
Express 提供了路由控制权转移的方法,即回调函数的第三个参数next,通过调用
next(),会将路由控制权转移给后面的规则,例如:
app.all('/user/:username', function(req, res, next) {
console.log('all methods captured');
next();
});
app.get('/user/:username', function(req, res) {
res.send('user: ' + req.params.username);
});
当访问被匹配到的路径时,如 http://localhost:3000/user/carbo,会发现终端中打印了 all
methods captured,而且浏览器中显示了 user: carbo。这说明请求先被第一条路由规
则捕获,完成 console.log 使用 next() 转移控制权,又被第二条规则捕获,向浏览器
返回了信息。
这是一个非常有用的工具,可以让我们轻易地实现中间件,而且还能提高代码的复用程
度。例如我们针对一个用户查询信息和修改信息的操作,分别对应了 GET 和 PUT 操作,而
两者共有的一个步骤是检查用户名是否合法,因此可以通过 next() 方法实现:
var users = {
'byvoid': {
name: 'Carbo',
website: 'http://www.byvoid.com'
}
};
app.all('/user/:username', function(req, res, next) {
// 检查用户是否存在
if (users[req.params.username]) {
next();
} else {
next(new Error(req.params.username + ' does not exist.'));
}
});
app.get('/user/:username', function(req, res) {
// 用户一定存在,直接展示
res.send(JSON.stringify(users[req.params.username]));
});
app.put('/user/:username', function(req, res) {
// 修改用户信息
res.send('Done');
});