【发布时间】:2018-11-28 23:38:09
【问题描述】:
根据我阅读的here 和here,您放置中间件功能的顺序很重要,因为如果将某些路由放在路由之前,您可以让某些路由不通过中间件功能,并且路由放在后面的会经过这个中间件函数。
我看到的结果好坏参半,因为我的开发环境不尊重这一点,而我的生产环境却是。代码完全一样。
我想要做的是让我的登录路由不受令牌检查器中间件功能的保护,而让我的其余路由受到令牌的保护。
这是我的代码:
routes.get('/login', function(req, res) {
// login user, get token
});
routes.use(function(req, res, next) {
// check header or url parameters or post parameters for token
var token = req.headers['access-token'];
// decode token
if (token) {
// validate token
}
else if (req.method === 'OPTIONS') {
next();
}
else {
// if there is no token
// return an error
return res.status(403).send({
success: false,
message: 'No token provided.'
});
}
});
routes.get('/query/:keywords', function(req, res) {
console.log(req.params.keywords);
// execute query
});
app.use('/', routes);
/query 路由是唯一应该通过令牌中间件功能的路由,对吗?现在我正在通过令牌中间件功能获得/login 路由,这没有意义,因为我不需要有令牌才能登录。
更好的是,如果有一种方法可以定位我想要保护哪些路由以及我不想保护哪些路由,这似乎比必须依赖中间件函数放置位置的“顺序”更好。
【问题讨论】:
-
应用到前一个的路由不应该发生......永远不会。 JavaScript 在这一点上是程序性的,全局中间件不应该应用于登录路由......您可以提供任何错误输出吗?
-
我的猜测是,不是
/login请求击中了您的令牌检查中间件。你应该在那个中间件中做一个console.log(req.url),看看它是什么。它很可能类似于对 favicon 资源的请求。除非您在/login路由处理程序中调用next(),否则在匹配/login后不会发生进一步的路由。
标签: node.js express jwt express-jwt