NodeJS 使用Multer和Express Validator时未定义请求文件和请求正文

vq8itlhq  于 2022-11-03  发布在  Node.js
关注(0)|答案(1)|浏览(125)

我有包含多个图像和一些输入的表单数据。当我只使用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且任何数据与模式中给定的不一致,我得到文件错误。

9rnv2umw

9rnv2umw1#

它是未定义的,因为您正在访问请求的未定义属性req.new_filesreq.bodyData,所以更改

console.log('req files--', req.new_files);
console.log('bodyData', req.bodyData)

console.log('req files--', req.files);
console.log('bodyData', req.body)

此外,不需要调用上载中间件两次,只需从路由处理程序调用一次即可:

router.post('/addDOoc', /*no need here => uploadDocs,*/ docSizeErrhandler, checkSchema(data), (req, res) => {
  uploadDocs(req, res, function (err) {

另外,要检查multer错误,请使用if (err instanceof multer.MulterError)而不是req.fileTypeErr,因为req.fileTypeErr可能始终未定义,因为它不是一个标准属性,而且与前面的属性一样,您似乎没有在任何地方设置它们。

相关问题