Javascript 将Express validator 6.4.0版与Express upload一起使用。在路由上执行post之前,请检查输入的有效性
在使用express upload解析多部分数据时,我想验证输入,包括使用express validator上载的图像。如果上载的文件是图像,并且没有上载图像,我想通过验证。我正在与使用旧api()的我一直坚持在新版本中实现同样的功能,并希望在项目中使用新的express validator 传统api app.js 路由文件也是为遗留api处理验证的文件 管理产品.jsJavascript 将Express validator 6.4.0版与Express upload一起使用。在路由上执行post之前,请检查输入的有效性,javascript,node.js,express,mean-stack,express-validator,Javascript,Node.js,Express,Mean Stack,Express Validator,在使用express upload解析多部分数据时,我想验证输入,包括使用express validator上载的图像。如果上载的文件是图像,并且没有上载图像,我想通过验证。我正在与使用旧api()的我一直坚持在新版本中实现同样的功能,并希望在项目中使用新的express validator 传统api app.js 路由文件也是为遗留api处理验证的文件 管理产品.js 我被卡住了,想在项目中使用新的express validator我也遇到了同样的问题,但我就是这样解决的: 1) 创建如下函
我被卡住了,想在项目中使用新的express validator我也遇到了同样的问题,但我就是这样解决的: 1) 创建如下函数: 函数isImage(文件){ } 2) 然后在validationResult(req)之后立即调用该函数,如下所示,并按下自定义错误对象: 错误=验证结果(req)
// Some code omitted for simplicity
// Express Validator middleware
var expressValidator = require('express-validator');
app.use(expressValidator({
errorFormatter: function (param, msg, value) {
var namespace = param.split('.')
, root = namespace.shift()
, formParam = root;
while (namespace.length) {
formParam += '[' + namespace.shift() + ']';
}
return {
param: formParam,
msg: msg,
value: value
};
},
customValidators: {
isImage: function (value, filename) {
var extension = (path.extname(filename)).toLowerCase();
switch (extension) {
case '.jpg':
return '.jpg';
case '.jpeg':
return '.jpeg';
case '.png':
return '.png';
case '':
return '.jpg';
default:
return false;
}
}
}
}));
/*
* POST add product
*/
router.post('/add-product', function (req, res) {
var imageFile = typeof req.files.image !== "undefined" ? req.files.image.name : "";
req.checkBody('title', 'Title must have a value.').notEmpty();
req.checkBody('desc', 'Description must have a value.').notEmpty();
req.checkBody('price', 'Price must have a value.').isDecimal();
req.checkBody('image', 'You must upload an image').isImage(imageFile);
var title = req.body.title;
var slug = title.replace(/\s+/g, '-').toLowerCase();
var desc = req.body.desc;
var price = req.body.price;
var category = req.body.category;
var errors = req.validationErrors();
if (errors) {
Category.find(function (err, categories) {
res.render('admin/add_product', {
errors: errors,
title: title,
desc: desc,
categories: categories,
price: price
});
});
} else {
Product.findOne({slug: slug}, function (err, product) {
if (product) {
req.flash('danger', 'Product title exists, choose another.');
Category.find(function (err, categories) {
res.render('admin/add_product', {
title: title,
desc: desc,
categories: categories,
price: price
});
});
} else {
var price2 = parseFloat(price).toFixed(2);
var product = new Product({
title: title,
slug: slug,
desc: desc,
price: price2,
category: category,
image: imageFile
});
product.save(function (err) {
if (err)
return console.log(err);
mkdirp('public/product_images/' + product._id, function (err) {
return console.log(err);
});
mkdirp('public/product_images/' + product._id + '/gallery', function (err) {
return console.log(err);
});
mkdirp('public/product_images/' + product._id + '/gallery/thumbs', function (err) {
return console.log(err);
});
if (imageFile != "") {
var productImage = req.files.image;
var path = 'public/product_images/' + product._id + '/' + imageFile;
productImage.mv(path, function (err) {
return console.log(err);
});
}
req.flash('success', 'Product added!');
res.redirect('/admin/products');
});
}
});
}
});
if (files !== null) {
let extension = files.image.name.split('.').pop();
console.log(extension)
switch (extension) {
case 'jpg':
return true;
case 'jpeg':
return true;
case 'png':
return true;
default:
return false;
}
} else return false;
if (!isImage(req.files))
errors.errors.push({ value: '', msg: 'You must upload an image', param: 'image', location: 'body' })