2016-02-19 127 views
1

我正在嘗試使用Express 4.0執行單個圖像文件+文本字段上傳& multer 1.1.0。圖像文件本身正確上傳到正確的目的地,但我與文本字段和響應收到錯誤:Express 4 Multer/req.body和res.json未定義

1) multer's req.body req.file objects are undefined if logged in console

2) res.json (and also res.send when tested) gets the error - TypeError: res.json is not a function at Object.handle)

multer被配置爲使用moment.js的日期如下,這幾乎是線換線從multer Github上的文檔:

//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> 

我在做什麼錯?

回答

3

Express中錯誤處理程序的簽名是(err, req, res, next)(4個參數),但Express比處理程序中的參數小4,因此它假定您正在添加常規路由處理程序。問題是你的路由處理參數的順序是錯誤的,它應該是(req, res)。這將解決您的res.json()錯誤。

爲了您的文件中的字段,你目前正在告訴multer你期望多個文件,所以在這種情況下,你需要檢查req.files,而不是req.file。如果您改用upload.single('photo'),則可以使用req.file

至於非文件字段,請確保它們實際上已提交給服務器,方法是使用瀏覽器的開發人員工具檢查表單提交的網絡請求。

+0

我應該補充一點,如果目標被定義爲一個函數,就必須確保這個目錄存在,如果沒有,就自己創建它。 –

+0

謝謝!它現在有效。解決req.file問題似乎也修復了req.body而無需進一步的工作 - 也許2是鏈接的。 –

相關問題