Express 支持同一路径绑定多个路由响应函数,(node)

本文介绍了Express框架中路由控制权转移的概念及其实现方法,包括如何使用next()函数进行控制权转移,以及如何利用这一特性实现中间件,提高代码复用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

控制权转移
        我们要绑定某个路径的 POST 请求,则可以用 app.post(path, callback)
        方法
。需要注意的是 app.all 函数,它支持把所有的请求方式绑定到同一个响应函数,是
        一个非常灵活的函数,在后面我们可以看到许多功能都可以通过它来实现。

       app.all('/user/:username', function(req, res) {
                res.send('all methods captured');
       });
       app.get('/user/:username',
                res.send('all methods captured');
       });
但当你访问任何被这两条同样的规则匹配到的路径时,会发现请求总是被前一条路由规
则捕获,后面的规则会被忽略。原因是 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/yd,会发现终端中打印了 all
methods captured
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');
});
上面例子中, app.all 定义的这个路由规则实际上起到了中间件的作用,把相似请求
的相同部分提取出来,有利于代码维护其他
next方法如果接受了参数,即代表发生了错误。
使用这种方法可以把错误检查分段化,降低代码耦合度



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值