我正在使用express-validator进行验证。在我的控制器中,我有一种方法可以将新图片添加到数据库中。这是我的代码:
function createPicture(req, res) {
req.checkBody('title', `The title can't be empty.`).notEmpty();
req.checkBody('image', 'You must select an image.').notEmpty();
let errors = req.validationErrors();
if (errors) {
res.json({errors: errors});
} else { ... }
代码适用于标题字段,但无论我是否选择图像 - 我仍然会收到有关它的验证错误。如何验证文件输入?我只是想要它。
答案 0 :(得分:4)
我遇到了同样的问题,下面的代码无效,因为express-validator只验证字符串
req.checkBody('title', 'The title can't be empty.').notEmpty();
req.checkBody('image', 'You must select an image.').notEmpty();
你需要编写一个自定义验证器,express-validator允许这样做,好吧这是一个例子
//requiring the validator
var expressValidator = require('express-validator');
//the app use part
app.use(expressValidator({
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';
default:
return false;
}
}
}}));
要使用自定义验证器,请首先执行此操作以确保空文件不会抛出未定义的错误:
restLogo = typeof req.files['rest_logo'] !== "undefined" ? req.files['rest_logo'][0].filename : '';
最后使用您的自定义验证器:
req.checkBody('rest_logo', 'Restaurant Logo - Please upload an image Jpeg, Png or Gif').isImage(restLogo);
感谢您提出的问题,希望这会对某人有所帮助
答案 1 :(得分:0)
为了验证文件输入字段,您可以使用 multer :将中间对象和文件对象添加到请求对象的中间件。
然后使用链接到您的验证中间件的 express-validator .custom() 验证功能。
使用multer可以通过req.file
访问文件输入字段,并通过req.body
访问其他输入字段(如果有)。
req.file
将返回一个包含以下6个字段的对象:(以pdf为例)
{
fieldname: 'fileInputFieldName',
originalname: 'uploaded_file.pdf',
encoding: '7bit',
mimetype: 'application/pdf',
buffer: <Buffer 2 ... 192685 more bytes>,
size: 192735
}
假设您只想接受pdf文件:
您可以针对上传文件的模仿类型进行验证(可以通过req.file.mimetype
访问):
// express-validator import
const { check, validationResult } = require('express-validator');
// multer import and setup
const multer = require('multer');
const storage = multer.memoryStorage(); // Holds a buffer of the file in memory
const upload = multer({ storage: storage });
exports.post_file = [
// multer middleware
upload.single('fileInputFieldName'),
// express-validator middleware
check('fileInputFieldName')
.custom((value, {req}) => {
if(req.files.mimetype === 'application/pdf'){
return '.pdf'; // return "non-falsy" value to indicate valid data"
}else{
return false; // return "falsy" value to indicate invalid data
}
})
.withMessage('Please only submit pdf documents.'), // custom error message that will be send back if the file in not a pdf.
// process the request with validated user inputs
(res, req, next) => {
...
...
}
]