2011-05-08 49 views
6

我的應用程序是使用Express的Node.js。POST數組數據以Express方式解析爲JSON

使用jQuery的POST我的客戶發送本次測試數據:

{ 
title: 'hello', 
notes: [ 
{title: 'note 1'}, 
{title: 'note 2'} 
] 

}

這是導致我的服務器代碼:

{ title: 'hello', notes: { '0': { title: 'note 1' }, '1': { title: 'note 2' } } } 

我想要得到的數組的筆記作爲數組插入到我的數據庫中。我錯過了什麼?


正如我不能添加一個答案自己8小時(WTF?),但它並沒有真正回答爲什麼Express.bodyParser不解析JSON正確

好吧,我可以得到它通過使用工作:然後服務器端使用

JSON.stringify (data) 
在客戶端上

JSON.parse(req.rawBody) 

這確實感覺不對,爲什麼Express.bodyParser不能正確解析JSON?

+0

你在帖子上序列化這些信息的代碼是什麼,你在服務器上用什麼代碼來反序列化它?例如:'JSON.stringify'等 – Tejs 2011-05-08 13:38:33

+0

我在Express中使用Node.js。它使用Express.bodyParser分析任何發送的主體請求。這就是我所知我是新手Node.JS – JMWhittaker 2011-05-08 15:08:12

回答

-4

這一切都有道理,你可以使用Express.bodyParser來得到這樣的結果,或者你可以使用JSON.parse甚至eval('(' + myPostedData + ')')來得到一個沒有索引的結果對象。

根據您當前的設置中,所有你需要做的是:

for(var j = 0; j < myVariable.notes.length; j++) 
{ 
    var currentNode = myVariable.notes[j]; 

    //currentode.title should be 'note 1' for j = 0, etc 
} 
+0

我得到你的理論,但notes.length是未定義的。 – JMWhittaker 2011-05-08 19:43:42

+4

針對客戶提交的數據使用'eval'是一個巨大的安全漏洞。應該避免使用'eval'作爲一般規則,並且在javascript中使用其他內部檢查和元編程的選項幾乎是不必要的。 – 2011-05-28 05:55:22

2

您可以發佈您的客戶端的jQuery代碼,請?默認情況下,jQuery將以urlencoded方式發送數據,而不是JSON。請參閱this question's answer以確保jQuery發送真正的JSON數據。

FYI的express/connect bodyParser middleware只是使用JSON.parse解析JSON(和qs.parse解析urlencoded的數據)。我不認爲這些代碼中有任何明顯的錯誤。因此,我認爲你應該仔細檢查你從瀏覽器發送的數據。

1

尋找一些其他的東西的NodeJS,當我遇到這個老問題就來了。

這是一種常見的誤解jQuery.ajax()功能使用JSON發送數據。數據由jQuery作爲POST數據發送,而不是JSON字符串。因此,所有數據類型(包括數組中的數字)都以字符串形式發送。

這意味着,快速解析「數組」鍵作爲一個字符串,因爲陣列中不能有JavaScript的字符串鍵而不一個對象,它被轉換爲一個對象。

16

在您的客戶端:

$.ajax({ 
    type: 'POST', 
    data: JSON.stringify(data), 
    contentType: 'application/json', 
    url: '/endpoint' 
}); 

在您的服務器:

console.log('POST: ',req.body); 

問題是jQuery的渣土發送之前各地與您的數據。如果您設置了正確的MIME類型,那麼它會讓您免費。

+0

我與Polymer的核心ajax有同樣的問題。將contentType設置爲application/json可以解決問題。謝謝。 – BKH 2015-04-04 18:47:10