我有包含多个图像和一些输入的表单数据。当我只使用multer上传文件时,一切都很顺利。但是当我使用express validator验证数据时,req。body和req。files是未定义的。下面是我的代码:
/*schema for validation*/
var data = {
'first_name': {
notEmpty: true,
errorMessage: "first name is required",
isAlpha: true,
errorMessage: 'first name must contain only alphabates',
trim: true,
escape: true
},
'last_name': {
notEmpty: true,
errorMessage: "last name is required",
isAlpha: true,
errorMessage: 'last name must contain only alphabates',
trim: true,
escape: true
},
'address': {
notEmpty: true,
errorMessage: "address is required",
},
'email': {
notEmpty: true,
errorMessage: "email id is required",
isEmail: true,
errorMessage: 'Enter Valid email',
normalizeEmail: true,
trim: true,
escape: true
},
'mbl_num': {
notEmpty: true,
errorMessage: "mobile number is required",
isInt: true,
errorMessage: 'mobile number must contain only numbers',
}
}
var maxSize = 3 * 1000 * 1000;//3mb
var DIR = './uploads/new/'; //uploads user documents folder
let docstorage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, DIR);
},
filename: (req, file, cb) => {
//cb(null, file.fieldname + '-' + Date.now() + '' + path.extname(file.originalname));
cb(null, file.fieldname + '-' + Date.now() + '' + '.pdf');
}
});
const docSizeErrhandler = (err, req, res, next) => {
if (err) {
//console.log('err in new function',err);
Apimessage = 'Select Valid File';
res.status(406).send({ Apimessage });
} else {
next()
}
}
/*upload function*/
var uploadDocs = multer({
storage: docstorage,
limits: { fileSize: maxSize },
fileFilter: function (req, file, cb) {
let file_name = file.originalname;
let file_ext = file_name.split('.')[1];
if (file.mimetype == 'application/pdf' && file_ext == 'pdf') {
cb(null, true)
} else {
req.fileTypeInvalid = 'goes wrong on the mimetype';
return cb(new Error('err in file upload'))
}
}
}).array('files', 12)
router.post('/addDOoc', uploadDocs, docSizeErrhandler, checkSchema(data), (req, res) => {
uploadDocs(req, res, function (err) {
if (err) {
if (req.fileTypeInvalid) {
let errMsg = 'only pdf are allowed';
return res.status(406).send({ errMsg })
}
if (err.code === 'LIMIT_FILE_SIZE') {
console.log('error in file upload file is two big');
Apimessage = err.message;
return res.status(406).send({ Apimessage });
}
} else {
let errors = validationResult(req);
if (!errors.isEmpty()) {
console.log('err', errors);
let resTosend = {
code: 1,
msg: 'Incorrect Data'
}
res.status(400).send((resTosend));
} else {
console.log('req files--', req.files);
console.log('bodyData', req.body);
}
}
});
});
当通过所有验证时,我得到未定义请求文件和请求主体。文件验证和Express验证器工作正常。如果文件扩展名不是pdf且任何数据与模式中给定的不一致,我得到文件错误。
1条答案
按热度按时间9rnv2umw1#
它是未定义的,因为您正在访问请求的未定义属性
req.new_files
和req.bodyData
,所以更改至
此外,不需要调用上载中间件两次,只需从路由处理程序调用一次即可:
另外,要检查multer错误,请使用
if (err instanceof multer.MulterError)
而不是req.fileTypeErr
,因为req.fileTypeErr
可能始终未定义,因为它不是一个标准属性,而且与前面的属性一样,您似乎没有在任何地方设置它们。