sangRam
sangRam

Reputation: 365

req files and req body are undefined when using multer and express validator

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

Answers (1)

traynor
traynor

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

Related Questions