我编写了一个通用验证函数,它将一个对象作为第一个参数,其属性required
(以及其他)是一个字符串数组。它用于根据required
中找到的任何密钥测试传入的前端数据。这是一个看起来如何的模型 - 使用下划线来检查isEmpty
:
validator.js
function validateRequest(options, req, done) {
const { body } = req;
const { required } = options;
const errors = {};
if (required && required.length) {
required.forEach(key => {
const value = `${body[key]}`;
if (_.isEmpty(value)) {
errors[key] = 'This field is required';
}
});
}
if (_.isEmpty(errors)) done({ success: true });
else done({ success: false, errors });
}
我目前正在使用它:
路由/ auth.js
router.post('/login', (req, res, next) => {
validator.validateRequest({
required: ['identifier', 'password']
}, req, result => {
if (!result.success) return res.status(400).send(result);
next();
});
}, auth.login);
我希望能够以更清洁的方式使用它,更像是:
router.post('/login', validator.validateRequest({
required: ['identifier', 'password']
}), auth.login);
我宁愿不使用app.use
,因为它让我不得不担心总是将它放在路径文件的适当层次结构中,并且在我需要它的意义上是不可扩展的。我还有其他参数作为options
传递,验证输入为数字,正确的邮政编码等,所以上面的函数比例子更深入。有没有办法让我在逐个路线的基础上使用这样的东西?我的中间件函数必须能够拦截(req, res, next)
,而不必每次都写出来......对吗?
答案 0 :(得分:0)
答案是使用更高阶函数返回一个函数,该函数将router.post('/login', validateRequest({
required: ['identifier', 'password']
}), auth.login);
作为参数,如下所示:
<强> validator.js 强>
{{1}}
然后可以这样使用:
<强>路由/ auth.js 强>
{{1}}