这是@szanata answer的扩展,这是合并用于验证请求正文的多个模式的工作示例。我将它创建为路由的中间件,有时最多有 3 个模式来验证请求正文。您可以传递单个架构或架构数组。
const validateRequest = (schema) => {
return (req, res, next) => {
if(Array.isArray(schema)){
let schemas = schema;
schema = schemas[0]
schemas.forEach((s, idx) => {
if (idx > 0) schema = schema.concat(s);
});
}
let data = { ...req.body, ...req.query, ...req.params };
const { error } = schema.validate(data, options);
if (error) res.status(422).json({msg:`${error.details.map((x) => x.message).join(", ")}`})
else next();
}
}
作为路由中间件的示例用法:
const { query, mongoDbId, test } = require("../utils/validation-schema");
const router = express.Router();
router.post("/test", protect, validateInput([mongoDbId, test, query]),
(req, res) => {
res.json({ msg: "OK" });
});
concat 后 console.log(schema._ids) 的输出。
{
_byId: Map {},
_byKey: Map {
'_id' => { schema: [Object], id: '_id' },
'databaseType' => { schema: [Object], id: 'databaseType' },
'host' => { schema: [Object], id: 'host' },
'database' => { schema: [Object], id: 'database' },
'user' => { schema: [Object], id: 'user' },
'password' => { schema: [Object], id: 'password' },
'datasource' => { schema: [Object], id: 'datasource' },
'sql' => { schema: [Object], id: 'sql' },
'modifier' => { schema: [Object], id: 'modifier' },
'sqlType' => { schema: [Object], id: 'sqlType' },
'format' => { schema: [Object], id: 'format' },
'timeout' => { schema: [Object], id: 'timeout' }
},
_schemaChain: false
}