Nodejs控制权转移 next all

来源:互联网 发布:知乎南方采暖方式 编辑:程序博客网 时间:2024/06/07 02:43

Express 支持同一路径绑定多个路由响应函数,例如:

app.all('/user/:username', function(req, res) {res.send('all methods captured');});app.get('/user/:username', function(req, res) {res.send('user: ' + req.params.username);});

但当你访问任何被这两条同样的规则匹配到的路径时,会发现请求总是被前一条路由规
则捕获,后面的规则会被忽略。原因是 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/fangchao,会发现终端中打印了 all
methods captured,而且浏览器中显示了 user: fangchao。这说明请求先被第一条路由规
则捕获,完成 console.log 使用 next() 转移控制权,又被第二条规则捕获,向浏览器
返回了信息.
这是一个非常有用的工具,可以让我们轻易地实现中间件,而且还能提高代码的复用程
度。例如我们针对一个用户查询信息和修改信息的操作,分别对应了 GET 和 PUT 操作,而
两者共有的一个步骤是检查用户名是否合法,因此可以通过 next() 方法实现:

var users = {'fangchao': {name: 'fangchao',website: 'http://www.fangchao.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');});

上面例子中, app.all 定义的这个路由规则实际上起到了中间件的作用,把相似请求
的相同部分提取出来,有利于代码维护其他next方法如果接受了参数,即代表发生了错误。
使用这种方法可以把错误检查分段化,降低代码耦合度

1 0
原创粉丝点击