我正在使用passport-jwt,并且有一个端点,如果标头中不存在jwt令牌,则该端点应该从数据库返回一些数据。 是否可以应用某些逻辑而不是仅发送未经授权的401?
router.get(
'/get/items',
passport.authenticate('jwt', {session: false}),
(req, res) => {
// reaches this point only after validating token
...
}
);
因此,如果存在jwt令牌,则端点应基于该令牌返回一些数据。如果没有,应该从数据库返回一些其他数据
答案 0 :(得分:2)
我认为custom callback是一个选择。它作为最后一个参数传递给let arrays = [[10, 20, 30], [1, 2, 3], [100, 200, 300]];
let sums = arrays[0]
.map((col, i) => arrays.map(row => row[i]))
.map(a => a.reduce((a, b) => a + b, 0));
console.log(sums);
方法,它将允许您设置所需的行为。
您的代码如下:
authenticate(strategy, options, callback)
在此示例中,请注意,从 路由处理程序,而不是用作路由中间件。这给 通过闭包对req和res对象的回调访问。
如果身份验证失败,则将用户设置为false。如果有例外 发生时,将设置err。一个可选的info参数将被传递, 包含策略验证提供的其他详细信息 回调。
回调可以使用提供的参数来处理 认证结果如所期望。请注意,使用自定义 回调,建立一个 会话(通过调用req.login())并发送响应。
答案 1 :(得分:1)
包装中间件并按需要处理错误:
function authenticate(req, res, next) {
passport.authenticate('jwt', { session: false }, (err, user) => {
if (err) {
res.status(err.statusCode || 401).json({ error: err.toString() });
return;
}
if (!user) {
res.status(404).json({ ... });
return;
}
req.user = user;
next();
})(req, res, next);
}
改用它:
router.get(
'/get/items',
authenticate,
(req, res) => {
// reaches this point only after validating token
...
}
);
答案 2 :(得分:0)
@codtex和@Dominic的答案解决了这个问题。
我发现以下解决方案也有效:
price time time_diff
0 1 2019-04-11 03:01:53.488000
1 0 2019-04-11 03:27:25.768000 03:25:33
2 1 2019-04-11 03:34:20.520000
3 0 2019-04-11 03:36:16.556000 03:01:56
etc...