这是新的 express-validator api (v4) 的解决方案:
tl;dr:你可以使用这个函数:
exports.testExpressValidatorMiddleware = async (req, res, middlewares) => {
await Promise.all(middlewares.map(async (middleware) => {
await middleware(req, res, () => undefined);
}));
};
可以这样调用这个:
const { validationResult } = require('express-validator/check');
await testExpressValidatorMiddleware(req, res, expressValidatorMiddlewareArray);
const result = validationResult(req);
expect(result....
这些解决方案假定您有可用的 async/await 语法。您可以使用node-mocks-http 库来创建req 和res 对象。
说明:
express-validator 数组中的每个元素都作为中间件应用于路由。说这是你的数组:
[
check('addresses.*.street').exists(),
check('addresses.*.postalCode').isPostalCode(),
]
每个检查都将作为中间件加载。
为了测试中间件,我们需要实现一个函数,其作用类似于 express 实现中间件的方式。
Express 中间件总是接受三个参数,即请求和响应对象,以及它应该调用的下一个函数(按照惯例,next)。为什么我们需要next?对于我们希望我们的中间件在处理函数之前和之后做某事的场景,例如
const loggerMiddleware = (req, res, next) => {
console.log('req body is ' + req.body);
next();
console.log('res status is ' + res.status);
};
但是 express-validator 不这样做,它只是在每个验证器完成后调用next()。出于这个原因,我们的实现并不真正需要打扰next()。
相反,我们可以只依次运行每个中间件并传递一个空函数作为next 以避免TypeError:
middlewares.map((middleware) => {
middleware(req, res, () => undefined);
});
但这行不通,因为 express-validator 中间件返回 Promise,我们需要等待它们解决...
middlewares.map(async (middleware) => {
await middleware(req, res, () => undefined);
});
在我们迭代中的所有承诺都得到解决之前,我们不想继续前进(Promise.all 上的 Mozilla 文档是 here):
await Promise.all(middlewares.map(async (middleware) => {
await middleware(req, res, () => undefined);
}));
我们应该把它提取为一个可重用的函数:
exports.testExpressValidatorMiddleware = async (req, res, middlewares) => {
await Promise.all(middlewares.map(async (middleware) => {
await middleware(req, res, () => undefined);
}));
};
现在我们已经找到了我的解决方案。如果有人可以改进此实现,我很乐意进行修改。