Multer访问req.body没有上传文件

问题描述:

我有一些文本字段和文件输入不能为空的表单,我想先用文本字段做一些操作(添加到数据库),如果这些操作成功了,上传文件。这是现在我的代码:Multer访问req.body没有上传文件

var multer = require('multer'); 
var getFields = multer(); 
router.post('/add',getFields.array(),function(req,res){ 
var artist = new ArtistModel({ 
      name : req.body.name.toLowerCase(), 
      description:req.body.description, 
      }); 

我再加入艺术家我DB和成功的回调我要上传的文件。然而,问题是我不能简单地使用getFields.array(),因为我有文件输入,并且出现“Unexpected fields”错误,如果我不使用.array(),我无法获得发布请求主体。无论如何,首先获得enctype =“multipart/form-data”的表单文本字段,然后上传文件?

更新#2 感谢Dave我能得到的文本字段,而上传文件,我成功添加我的艺术家到我的数据库,但我无法弄清楚如何上传文件后, 我在我addToDb的回调函数创建一个新的变量:

var storage = multer.diskStorage({ 
      destination: function (req, file, cb) { 
       //cb(null, 'artistsMedia/drake/songs') 
       var dir = 'artistsMedia/' + req.body.name.toLowerCase()+ '/images'; 
       mkdirp(dir,err => cb(err,dir)) 
      }, 
      filename: function (req, file, cb) { 
       cb(null, req.body.name.toLowerCase() +'-'+ file.fieldname +'-'+ Date.now() + path.extname(file.originalname)) //Appending extension 
      }, 

      }); 
      var upload = multer({ 
      storage: storage, 
      limits :{fileSize :52428800} 
      }).fields([{name:'Logo',maxCount:1},{name:'artistHome',maxCount:1},{name:'otherImgs',maxCount:10}]); 

但是调用upload(req,res,err)似乎没有工作。

+0

如果你想创建艺术家后,将文件上传,REST的方式是创建艺术家,使用Location响应头返回201 CREATED响应(也可能是一个包含新创建对象的主体)。然后,客户端将解析响应主体或响应头以确定新对象的ID,然后发出* second *请求来POST文件。 (或者你可以发送第一个请求的文件,并一次完成)。 – Dave

尝试用multer的any()功能:

var multer = require('multer'); 
var getFields = multer(); 
router.post('/add',getFields.any(),function(req,res){ 
    // any files, if sent, will be in req.files 
    var artist = new ArtistModel({ 
    name : req.body.name.toLowerCase(), 
    description:req.body.description, 
    }); 
}); 

如果你是肯定会有没有提交任何文件,请使用multer的none()功能:

var multer = require('multer'); 
var getFields = multer(); 
router.post('/add',getFields.none(),function(req,res){ 
    // uploading files will cause an error 
    var artist = new ArtistModel({ 
    name : req.body.name.toLowerCase(), 
    description:req.body.description, 
    }); 
});