如何手动调用多个 express 中间件

How to invoke multiple express middlewares manually

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

These middlewares are generated from the express validator checkSchema method.

所以我写了一个中间件,它可以访问请求对象,我可以从请求有效负载中读取 属性,然后决定哪个模式必须是 运行。

一个实现就像这样。

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
  }
});

Here schema1 and schema 2 are not single middleware. It is a middleware array.

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

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

根据这个问题Use an array of middlewares at express.js there is one repo: 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);
  }
});

我已经发布了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 是否有错误,相应地呈现不同的页面,等等 - 由你决定!