我在使用express作为路由器的nodejs中进行API。
现在,我正在尝试实现一个客户端ID和一个apikey来为API添加一些安全性,而我面临的问题是下一个:&/ p>
我的一个API调用是这样的:
router.get("roles/get-objects/:mail/:filter*?")
所以这意味着,我可以请求这样的对象:
/roles/get-objects/mail@mail.com/customer
现在,棘手的部分开始......当我需要建立中间件来读取客户端ID和apikey来验证客户端是否有权获取API时,我这样做了:
在中间件的声明中,我使用这个通配符:
router.all('/*', function (req, res, next) {
XXXX})
问题是,我在中间件中试过,作为通配符一切...... 我希望通过该中间件过滤任何API调用,但显然我无法为其找到正确的通配符...
当我使用/ roles / *作为通配符时,如果我向/roles
发出请求它确实有效,但当我使用完整的网址时:/roles/get-objects/mail@mail.com/customer
它不会通过我的中间件。
所以有人有任何想法吗?我开始放松心情了
非常感谢你们所有人!
修改
现在我使用这个中间件声明:
router.use(function (req, res, next) {XXXX})
所以当我打电话的时候:
/roles/get-objects/
它被执行了,问题是当我将电子邮件添加到路由时:
/roles/get-objects/mail@mail.com
应用程序直接进入我的路线,但省略了我的中间件: router.get("角色/获取的对象/:邮件",
我不明白为什么会发生这种情况,显然一切都应该先通过我的中间件,或者我错了?
答案 0 :(得分:1)
如果要建立中间件来检查其URL以/roles/
开头的所有HTTP请求,则应将中间件置于之前任何其他特定路由器定义:
router.use('/roles', function(req, res, next) {...});
...
router.get('/roles/get-objects/:mail', ...);
如果在特定路由之后定义了中间件,当HTTP请求进入时,特定路由被定位并处理,中间件不再被执行:
router.get('/roles/get-objects/:mail', ...);
...
router.use('/roles', function(req, res, next) {...}); // This middleware logic won't execute when request is sent to '/roles/get-objects/some-email', as the request has already been handled and response is already sent to browser.