2015-12-24 14 views
0

我正在測試發佈方法以創建待辦事宜項目,如下所示。我使用郵遞員在鉻模擬post方法調用。但是,它不起作用,並給我下面的錯誤。我懷疑body-parser庫的工作方式有問題。我在這裏做錯了什麼?使用快遞進行發佈時出錯JS

enter image description here

1 SyntaxError: Unexpected token b 
2: at parse (/Users/zack/mydrive/proj/express-demo/node_modules/body-parser/lib/types/json.js:83:15) 
3: at /Users/zack/mydrive/proj/express-demo/node_modules/body-parser/lib/read.js:116:18 
4: at invokeCallback (/Users/zack/mydrive/proj/express-demo/node_modules/body-parser/node_modules/raw-body/index.js:262:16) 
5: at done (/Users/zack/mydrive/proj/express-demo/node_modules/body-parser/node_modules/raw-body/index.js:251:7) 
6: at IncomingMessage.onEnd (/Users/zack/mydrive/proj/express-demo/node_modules/body-parser/node_modules/raw-body/index.js:308:7) 
7  at IncomingMessage.emit (events.js:104:17) 
8  at _stream_readable.js:908:16 

代碼:

var express = require('express'); 
var app = express(); 
var handlebars = require('express-handlebars'); 
var bodyParser = require('body-parser'); 

//MIDDLEWARE 
app.engine('handlebars', handlebars({defaultLayout: 'main'})); 
app.set('view engine', 'handlebars'); 

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

// TODOS 
var todos = [ 
    { body: "take out the trash",completed: false}, 
    { body: "Do the laundry",completed:true}, 
    { body: "Make a screencast",completed:false} 
] 

app.post('/todos', function (req, res){ 
    console.log("todo:", req.body); 
    var todo = req.body; 
    console.log("todo:"+todo); 
    todos.push(todo); 
    res.status(200).json(todo); 
    res.send('OK') 
}) 

而且我觀察到的問題是,因爲這一行的。

app.use(bodyParser.json()); 
+0

你在郵遞員發送的數據是什麼樣的? – tymeJV

+0

確保您的數據是有效的JSON。我的猜測是你正在使用JavaScript語法。例如,JavaScript語法應該是'{bar:「baz」}「,但JSON需要引用鍵例如:」{「bar」:「baz」}'。 – mscdex

+0

@tymeJV添加了郵差的截圖 – Zack

回答

0

您確定您將請求作爲JSON發送嗎?確保你已經在Postman中選擇了它 - https://imgur.com/j0M7TEX

如果沒有工作,你可以嘗試以下 -

...

app.post('/todos', function (req, res){ 
    console.log("todo:", req.body); 
    var todo = req.body; 
    console.log("todo:"+todo); 
    todos.push(todo); 

    // Only try to send a single response. 
    res.json(todo); 
}); 

它看起來像你正在嘗試發送兩個響應,包含JSON一個,另一個文本/ plain('Ok')。

http://expressjs.com/fr/api.html#res.json

+0

不,這不是問題。我一次使用一個資源。我評論其他。在此處粘貼代碼時,我忘了發表評論。您的解決方案不能解決問題。謝謝。 – Zack

0

好像你的程序試圖解釋後的數據作爲JSON數據 - 當它改掉來分析這可能是URL編碼的請求數據生成錯誤。

也許考慮以json格式發送數據。您將必須設置請求標頭以指示數據類型爲json。看到這個答案的一個例子:

Angular JS POST request not sending JSON data

0

我剛剛創建的郵遞員一個新的會話,並開始工作。我不確定是否有緩存效果,但現在可以使用。我根本沒有做任何代碼改變。現在將其作爲解決方案發布。

+0

我剛剛複製了所有的代碼1:1,並沒有任何問題(按預期運行)。我很高興你能設法找到它周圍的光芒。 –

0

只是不要把報價放在你的JSON值上。

不是「okay2」但只是okay2

我認爲,郵遞員如果需要自己添加引號,並在這種情況下創建「」okay2「」這是不是有效的JSON。

順便說一句,您可以通過單擊「行」單選按鈕進行測試並編寫自己的JSON。