我有一种情况,我想根据请求有效负载来调用多个快速中间件。
这些中间件是从快速验证器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);
如果有人经历过,请建议我手动运行中间件阵列的方法是什么。
答案 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);
}
});