如何手动调用多个 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
是否有错误,相应地呈现不同的页面,等等 - 由你决定!
我有一种情况,我想根据请求负载调用多个快速中间件。
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
是否有错误,相应地呈现不同的页面,等等 - 由你决定!