我目前使用2个中间件:
Express-jwt从请求中提取/验证JsonWebToken,以及我自己的中间件,用于检查JWT是否包含特定信息(权限)。
我想有条件地将这些中间件一起使用(根据路由上是否存在特定的swagger属性)。
我想做这样的事情:
let expressjwt = function(req, res, next) { ... };
let jwtValidator = function(req, res, next) { ... };
app.use((res, req, next) => {
if(req.swagger.someAttribute) {
expressjwt(req, res, jwtValidator(req, res, next));
// The issue here is that jwtValidator will get called even if
// expressjwt produces an error
} else {
next();
}
});
答案 0 :(得分:1)
听起来问题是 - "只有在服务A成功的情况下,您如何有条件地呼叫服务B."
这是承诺的主要目标之一 - 它允许您将异步调用链接在一起并有条件地使它们解决。"如果需要,我可以发布代码示例。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
答案 1 :(得分:0)
我最终使用Promise.fromCallback
从内存中将我的第一个中间件包装在Promise中,如下所示:
if (req.swagger.someAttribute) {
Promise.fromCallback(cb => expressjwt(req, res, cb))
.then(() => {
return jwtValidator(req, res, next);
})
.catch(next); // Or deal with the rejection
} else {
next();
}
Promise.fromCallback
非常有用,因为next()
仅在中间件失败时才会使用参数调用,因此将成为promise.reject