如何手动调用多个快速中间件

时间:2019-06-20 16:05:38

标签: node.js express express-validator

我有一种情况,我想根据请求有效负载来调用多个快速中间件。

  

这些中间件是从快速验证器checkSchema生成的   方法。

因此,我编写了一个中间件,该中间件可以访问请求对象,并且可以从请求有效负载中读取属性,然后确定必须运行哪种模式。

一个实现会这样。

let app = express();

let schema1 = checkSchema({
  field1: {
    in: ["body"],
    exists: {
      errorMessage: "field1 is missing",
    }
  }
});

let schema2 = checkSchema({
  field2: {
    in: ["body"],
    exists: {
      errorMessage: "field 2 is missing",
    }
  }
});

app.post("/resource", (req, res, next) => {
  if(req.body.type === "TYPE1") {
    // Invoke schema1 middleware
  }
  if(req.body.type === "TYPE2") {
    // Invoke schema2 middleware
  }
});
  

这里schema1和schema 2不是单个中间件。它是一个   中间件数组。

如果是中间件,我可以调用schema1(req,res,next);

如果有人经历过,请建议我手动运行中间件阵列的方法是什么。

2 个答案:

答案 0 :(得分:1)

我已经发布了express-validator v6.0.0,它应该有助于解决此类问题。

现在有一种.run(req)方法,可以让您do things with express-validator in an imperative way

对于您的用例,您可以执行以下操作:

app.post("/resource", async (req, res, next) => {
  if(req.body.type === "TYPE1") {
    await Promise.all(schema1.map(chain => chain.run(req)));
  }
  if(req.body.type === "TYPE2") {
    await Promise.all(schema2.map(chain => chain.run(req)));
  }
});

checkSchema returns an array of validation chains起,代码将它们各自映射到各自的执行承诺。
完成所有承诺后,您的代码可以继续执行并做您想做的任何事情。也许检查validationResult是否存在错误,相应地渲染其他页面,等等-由您决定!

答案 1 :(得分:0)

根据这个问题Use an array of middlewares at express.js,有一个仓库:https://github.com/blakeembrey/compose-middleware

根据自述文件:

app.use(compose([
  function (req, res, next) {},
  function (err, req, res, next) {},
  function (req, res, next) {}
]))

所以,您可以做的是:

app.post("/resource", (req, res, next) => {
  if(req.body.type === "TYPE1") {
    compose(schema1)(req,res,next);
  }
  if(req.body.type === "TYPE2") {
    compose(schema2)(req,res,next);
  }
});