手动链接Express中间件

时间:2016-02-02 16:09:06

标签: javascript node.js express

我目前使用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();
    }
});

2 个答案:

答案 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