Reputation: 365
I have form data which contains multiple images and few inputs. When I use only multer for file uploading then all goes well. but when I use express validator for validating data req.body and req.files are undefined. following is my code:
/*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);
}
}
});
});
I get req files and req body undefined when all validation is passed. file validation and express validators work fine. I get file error if file extension is not pdf and any data is not as given in schema.
Upvotes: 0
Views: 991
Reputation: 8752
It's undefined because you're accessing request's undefined properties req.new_files
and req.bodyData
, so change
console.log('req files--', req.new_files);
console.log('bodyData', req.bodyData)
to
console.log('req files--', req.files);
console.log('bodyData', req.body)
Also, no need to call upload middleware twice, call it once from the route handler:
router.post('/addDOoc', /*no need here => uploadDocs,*/ docSizeErrhandler, checkSchema(data), (req, res) => {
uploadDocs(req, res, function (err) {
and also, to check multer error, use if (err instanceof multer.MulterError)
instead of req.fileTypeErr
which is probably always undefined, because it's not a standard property, and like previous properties, you don't seem to set them anywhere.
Upvotes: 0