2014-10-07 45 views
0

閱讀很多類似的線程後,我沒能看到我的問題的原因...在POST發送無req.body請求

我試着去了解如何創建一個RESTful API和節點,並表示4,漂亮基本和簡單,但是當我嘗試用POST請求保存我的文檔時,請求上沒有發送req.body,我有一些問題。

讓我們看一小塊代碼:

module.exports = (router, Bear) -> 
    router.route '/bears' 
    .get (req, res) -> 
     Bear.find (err, bears) -> if err then err else res.json bears 

    .post (req, res) -> 
     newBear = 
     _id: req.body.bearId 
     nombre: req.body.nombre 
     bear = new Bear(newBear) 
     bear.save (err) -> 
     if err then res.send err 
     # res.json msg: "#{bear.nombre}, creado" 
     res.json msg: "created" 

到目前爲止,這是我的基本路線的配置(現在)。服務器是:

express = require 'express' 
app = express() 
morgan = require 'morgan' 
bodyParser = require 'body-parser' 
mongoose = require 'mongoose' 

app.use bodyParser.urlencoded extended: true 
app.use bodyParser.json() 
app.use morgan 'dev' 

require('./app/config/js/database')(mongoose) 

router = express.Router() 
Bear = require './app/models/js/bear' 

router.get '/', (req, res) -> res.json msg: 'It works' 

require('./app/routes/js/bears')(router, Bear) 

app.use '/api', router 

port = 8080 

app.listen(port) 
console.log("Corriendo en #{port}") 

和代碼的其他部分都沒有與此有關(我認爲),所以,當我使用郵遞員或捲曲發送一個請求,我總是得到一個{}響應和崩潰的消息我的服務器:

home/nano/Dev/bears/node_modules/mongoose/lib/utils.js:413 
     throw err; 
      ^
Error: Can't set headers after they are sent. 
    at ServerResponse.OutgoingMessage.setHeader (http.js:689:11) 
    at ServerResponse.header (/home/nano/Dev/bears/node_modules/express/lib/response.js:662:10) 
    at ServerResponse.send (/home/nano/Dev/bears/node_modules/express/lib/response.js:146:12) 
    at ServerResponse.json (/home/nano/Dev/bears/node_modules/express/lib/response.js:235:15) 
    at Promise.<anonymous> (/home/nano/Dev/bears/app/routes/js/bears.js:22:20) 
    at Promise.<anonymous> (/home/nano/Dev/bears/node_modules/mongoose/node_modules/mpromise/lib/promise.js:172:8) 
    at Promise.emit (events.js:95:17) 
    at Promise.emit (/home/nano/Dev/bears/node_modules/mongoose/node_modules/mpromise/lib/promise.js:84:38) 
    at Promise.reject (/home/nano/Dev/bears/node_modules/mongoose/node_modules/mpromise/lib/promise.js:111:15) 
    at Promise.error (/home/nano/Dev/bears/node_modules/mongoose/lib/promise.js:95:15) 

真的我不知道我真的不知道該怎麼做,我已經整個下午,並在這個夜晚。

嗯,我在代碼中進行了更改,現在回溯消失了,但請求仍然是空的。

module.exports = (router, Bear) -> 
    router.route '/bears' 
    .get (req, res) -> 
     Bear.find (err, bears) -> 
     if err then return res.send err 
     res.json bears 

    .post (req, res) -> 
     newBear = 
     _id: req.body.bearId 
     nombre: req.body.nombre 
     bear = new Bear(newBear) 
     bear.save (err) -> 
     if err then return res.send err 
     res.json msg: "created" 

的JS代碼:

(function() { 
    module.exports = function(router, Bear) { 
    return router.route('/bears').get(function(req, res) { 
     return Bear.find(function(err, bears) { 
     if (err) { 
      return res.send(err); 
     } 
     return res.json(bears); 
     }); 
    }).post(function(req, res) { 
     var bear, newBear; 
     newBear = { 
     _id: req.body.bearId, 
     nombre: req.body.nombre 
     }; 
     bear = new Bear(newBear); 
     return bear.save(function(err) { 
     if (err) { 
      return res.send(err); 
     } 
     return res.json({ 
      msg: "created" 
     }); 
     }); 
    }); 
    }; 

}).call(this); 

我通過RESTClient實現發送請求的Firefox,捲曲,郵遞員......內容類型頭是Content-Type: application/json; charset=utf-8

+0

你能指出棧跟蹤中的相關行是在哪裏嗎?例如,'bears/app/routes/js/bears.js:22'。 – 2014-10-07 03:06:26

+1

我不熟悉** CoffeeScript **,所以我不能發表一個例子。但它似乎查詢有錯誤,並且如果err然後res.send err正在執行。然後'res.json msg:「created」'也被執行。在這種情況下,你需要在** CoffeeScript **中使用'return'嗎?也可能想先查看是否實際存在錯誤。 – Jordonias 2014-10-07 03:23:24

+1

用於查看第22行的+1 – xShirase 2014-10-07 03:51:23

回答

0

如果你註釋掉:

Bear = require './app/models/js/bear' 

並替換:

require('./app/routes/js/bears')(router, Bear) 

有:

router.post "/bears", (req, res, next) -> 
    console.log req.body 
    res.json req.body 
    return 

,你會看到req.body即將通過。

正如在評論中提到的,在你的bears.coffee路由文件丟失回報 statment。您需要更改第12行以使其顯示如下:

if err then return res.send err 

確保您在請求正文中發送參數。對於捲曲你應該使用:

curl -X POST -d "bearId=1221&nombre=papa" http://localhost:8080/api/bears 

爲郵差,請務必從下拉列表中選擇POST和你點擊的X WWW的形式,進行了urlencoded,並把您的參數中的「關鍵」和「價值」領域分別。

+0

替換需求代碼並放入裸露帖子,請求仍爲空: ' - {} POST/api/bears?_id = 4&nombre = pepel 200 67.580 ms - 2' – Nano 2014-10-07 14:20:42

+0

那麼,在看到您的請求後,您將請求參數放入URL而不是正文中。那些將使用req.param而不是req來訪問。身體。對於POST請求,您應該將它們傳遞給主體。如果您使用Postman,則需要確保單擊x-www-form-urlencoded並在「密鑰」和「值」字段中添加參數。我會更新我的答案。 – DanArl 2014-10-07 15:46:30

+0

它的工作原理是,問題出現在x-www-form-urlencoded ......謝謝大家! – Nano 2014-10-08 02:18:57