2017-03-08 186 views
1

我真的很習慣使用REST和Express,我一直在關注REST API上的這個 tutorial。這裏是我的app.js代碼:使用POST方法時Node.js req.body爲空

var express = require('express'); 
var bodyParser = require('body-parser'); 
var mongoose = require("mongoose"); 

var app = express(); 
var port = parseInt(process.env.PORT, 10) || 3000; 

app.use(bodyParser.urlencoded({ extended: true})); 
app.use(bodyParser.json()); 

Genre = require('./models/genre'); 

//Connect to mongoose 
mongoose.connect('mongodb://localhost/bookstore'); 

var db = mongoose.connection; 

app.listen(port); 
console.log('Running on port 3000\n\n'); 

app.post('/api/genres', function(req, res){ 
     console.log(req.body); 
     var genre = req.body; 
     Genre.addGenre(genre, function(err, genre){ 
      if (err) { 
       console.log(err); 
       res.send({status: 'something went wrong'}); 
      }else{ 
      res.send({status: 'saved'}); 
      res.json(genre);} 
     }); 
}); 

我使用Firefox的休息便於檢查POST請求。正在生成的錯誤是「體裁驗證失敗」,因爲身體是空的。用於此的架構模型中定義爲:

var mongoose = require("mongoose"); 

//Genre Schema 
var genreSchema = new mongoose.Schema({ 

    name: { 
     type: String, 
     required: true 
    }, 
    create_data:{ 
     type: Date, 
     default: Date.now 
    } 
}); 

var Genre = module.exports = mongoose.model('Genre', genreSchema); 

// add genre 
module.exports.addGenre = function(genre, callback){ 
    Genre.create(genre, callback); 
}; 

我試過其他一些流行的線程,但它仍然沒有解決問題。我試着重新排列模塊導入的順序,並使用'application/x-www-form-urlencoded'作爲表單輸入數據。任何想法?

編輯:執行console.log輸出(req.body):執行console.log(REQ)的

{} 

輸出爲上jsfiddle.net jbkb1yxa(StackOverflow上不會讓我嵌入。更多的聯繫,因爲我有低信譽分,道歉) 截圖REST的方便: http://imgur.com/6QmQqRV

+0

顯示您的console.log(req)和console.log(req.body)的結果。您可能會以錯誤的格式傳遞POST請求。確保請求正文是JSON。您可以添加傳遞參數方式的圖像。 – rresol

+0

如何發佈POST請求? – jfriend00

+0

這可能是你對api做POST請求的方式,然後是其他任何東西。 – nozari

回答

0

在郵遞員的3種選擇可用於內容類型選擇「X-www-form-urlencoded」,它應該工作。

app.use(bodyParser.urlencoded({ 
    extended: true 
})); 

參見https://github.com/expressjs/body-parser

的「體解析器」中間件只處理JSON和urlencoded進行數據

在郵差,與原料JSON數據有效載荷來測試HTTP後操作,選擇原始選項和設置以下頭參數:

Content-Type: application/json 

此外,一定要包裹在雙引號作爲鍵/值的JSON有效載荷的任何字符串。

body-parser包將解析多行原始JSON有效載荷就好了。

{ 
    "foo": "bar" 
} 
0

你需要在REST易邊數據部分輸入正確的MIME類型:

application/json 
+0

我試過這樣做,但它仍然沒有幫助。 –

0

這很可能是因爲您對數據庫的調用沒有找到您要查找的內容。當我開始學習貓鼬時,對我來說一個巨大的痛點是我錯誤地預期了一個空的答案被計爲err,但事實並非如此。

如果您將console.log(genre)放在您的res.sendres.json陳述之上,會發生什麼情況?

此外,只是想知道,爲什麼你用res.send其次res.json

+0

其他語句不執行。它仍然在如果和打印「出了問題」。在Genre.addGenre導致[對象對象]之前的控制檯日誌記錄。 –

0

好的。所以我猜這可能是一個擴展問題。我使用相同的代碼在Chrome中使用POSTMAN發送POST請求,現在它工作得很好。早些時候,即使郵差沒有工作,但我配置鉻不使用代理服務器後,它工作得很好。

謝謝大家幫助我。