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
- Nodejs控制权转移 next all
- NodeJs——(11)控制权转移next
- cocos2d-x游戏项目初始阶段控制权转移过程
- nodejs 在路由中使用通配符以及转交控制权
- nodejs项目node-sass转移问题 npm rebuild node-sass
- Sort String Array Make All Anagrams Next To each Other
- 转移
- 转移
- 转移
- ProcessMessages转让控制权
- CPU控制权的夺回
- 马云终获阿里巴巴控制权
- 包和访问控制权
- next()
- next()
- Next
- next()
- next
- minFunc 2012:Huber loss
- C语言-栈
- matlab 错误使用*
- redis启用持久化
- 黑马程序员 —— 初识C语言及第一个C语言程序分析
- Nodejs控制权转移 next all
- lightoj 1275 - Internet Service Providers 一元二次方程
- Linux Wireless架构总结
- org.springframework.web.servlet.DispatcherServlet
- 微信网页支付jsapi传参问题解决(使用微信官方SDK)
- activity劫持反劫持
- matlab学习笔记 函数bsxfun repmat
- 菜鸟学python(10) 用python处理Layer导出的域名(将每个域名前加入http://)
- 制作网页---html拾遗