Express 4 Multer / req.body和res.json未定义

我试图做一个单一的图像文件+文本字段上传使用Express 4.0和multer 1.1.0。 图像文件本身正确上传到正确的目的地,但我得到的文本字段和响应错误:

1)如果login控制台,multer的req.body req.file对象是未定义的

2)res.json(也testing时res.send)得到错误 – TypeError:res.json不是在Object.handle函数)

multer的configuration如下,使用moment.js作为date,这几乎是来自multer Github文档的line-for-line:

//standard express-generator server.js requires //passport.js implementation var multer = require('multer'); var storage = multer.diskStorage({ destination: function(req, file, cb){ cb(null, './public/photoUploads/' + moment().year() + moment().month()); }, filename: function(req, file, cb){ cb(null, req.user._id + moment().unix()); } }) var upload = multer({storage:storage}); require('./app/routes.js')(app, passport); //passport login routes - will eventually move app.post into this file app.post('/upload/photoData', upload.array('photo'), function(err, req, res) { var title = req.body.title; var description = req.body.description; var photoURL = req.file.filename; var jsonResponse = { "title": title, "description": description, "photoURL": photoURL } console.log(jsonResponse); res.json(jsonResponse); }); 

这里是客户端表单

  <form id="photo-data" method="post" action="/upload/photoData" enctype="multipart/form-data"> <div class="form-group"> <div class="modal-body"> <label for="image" class="control-label">Photo upload</label> <input type="file" class="form-control" name="photo" id="photo-main"> <label for="caption" class="control-label">Title:</label> <input type="text" class="form-control" name="title" id="photo-title"> <label for="long-text" class="control-label">Further description:</label> <input type="text" class="form-control" name="description" id="message-text"> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> <button id="submit-photo" type="submit" class="btn btn-primary">Upload</button> </div> </div> </form> 

我究竟做错了什么?

Express中error handling程序的签名是(err, req, res, next) (4个参数),但Express比处理程序中的参数less4个,所以假定您正在添加一个正常的路由处理程序。 问题是你的路由处理参数的顺序是错误的,它应该是(req, res) 。 这将解决你的res.json()错误。

对于你的文件字段,你目前正在告诉multer你期望多个文件,所以在这种情况下,你将需要检查req.files而不是req.file 。 如果您使用upload.single('photo') ,则可以使用req.file

至于非文件字段,通过浏览器的开发人员工具检查表单提交的networking请求,确保它们实际上已经提交给服务器。