我正在尝试扩展expressValidator以添加我的自定义规则,以检查req.files是否作为图像进入。因为express-validator使用node-validator,而node-validator正在解析输入参数的请求体:
req.body.email
作为req.assert('email', 'Please enter a valid Email').isEmail()
传入,因此使用express-validator传递到req.assert()
的任何内容都需要是参数名称。
这是我遇到问题的地方,因为我有我在这里写的方法:
expressValidator.Validator.prototype.isImage = function() {
var type = this.str,
allowedTypes = ['gif', 'jpg', 'jpeg', 'png'],
allowed = false;
for (var i = 0; i < allowedTypes.length; i++) {
if (type.indexOf(allowedTypes[i]) !== -1) {
allowed = true;
}
}
if (!allowed) {
this.error(this.msg);
}
return this;
};
但我不能只做req.assert('avatar', 'Please enter a valid image type').isImage()
,因为对于其中一个,我需要传递req.files.avatar.type
。对于req.assert()
,第一个参数需要一个字符串。
如果我确实给它字符串:例如我的错误消息对象中的req.assert(req.files.avatar.type, 'Please enter a valid image type').isImage()
,它会显示:
{ 'image/png':
{ param: 'image/png',
msg: 'Please enter a valid image',
value: undefined }
}
何时应该显示:
{ 'avatar':
{ param: 'avatar',
msg: 'Please enter a valid image',
value: 'image/png' }
}
答案 0 :(得分:0)
最近我做了类似的事。但我的方法有点不同,更有点黑客。但既然没有人回答,我会尽力帮助:)
我写了一个通用错误生成vaildator.prototype
expressValidator.Validator.prototype.genError = function() {
this.error(this.msg);
return this;
};
然后在验证时,
var validate_profile = function(req, next) {
async.series([
function(callback) {
req.assert('name', 'Please provide your name.').notEmpty().notNull();
.........
},
function(callback) {
// Validate image size for profile_picture
if(req.files.profile_picture && req.files.profile_picture.size === 0) {
req.assert('profile_picture', 'Profile picture is required').genError();
}
if(req.files.profile_picture && req.files.profile_picture.size > 0) {
imageMagick(req.files.profile_picture.path).size(function(err, size) {
if (err) throw err;
if(size.width < 1200) {
req.assert('profile_picture', 'Profile picture should have atleast 1200px width').genError();
callback(null);
} else callback(null);
.......
这对我很有用。你的方法当然更好,但这也有效:)