2014-12-11 60 views
2

已解決!看到這篇文章底部的解決方案......我一直在這個問題上停留了大約2天,現在開始接觸到我。我試圖將Json數組發佈到我的節點服務器(跨域)並將其插入到雲數據庫。這個問題更多的是關於以正確的格式獲取JSON。這裏是我的客戶端JSON和Ajax:ajax POST JSON數組到nodejs服務器刪除密鑰

function stress(){ 
var start = new Date().getTime(); 
$.ajax({ 
    type: 'POST', 
    url: 'url/', 
    crossDomain: true, 
    data: JSON.stringify(products), 
    dataType: 'json', 
    contentType: "application/x-www-form-urlencoded; charset=UTF-8", 
    success: function(responseData, textStatus, jqXHR) { 
     var end = new Date().getTime(); 
     var millis = (end - start); 
     var duration = (millis/1000); 
     alert(responseData.msg +'Duration(seconds): ' + duration); 
    }, 
    error: function (responseData, textStatus, errorThrown) { 
     alert('POST failed. ' + JSON.stringify(responseData) + " status: " + textStatus + " Error: " + errorThrown); 
    } 
}); 
} 

var products = [ 
{ 
    name: 'War Room Table', 
    year: '2005', 
    color: 'tan', 
    country: 'USA', 
    description: 'A Beautiful War Room table. Includes all 4 legs!', 
    usaDollarPrice: 150 
}, 
{ 
    name: 'Power Strip', 
    year: '2000', 
    color: 'white', 
    country: 'USA', 
    description: 'A very old power strip, may or may not protect against power surges.', 
    usaDollarPrice: 16 
}]; 

我的Node.js服務器端:

exports.create = function(req, res) { 
    var data = req.body; 
    res.setHeader('Access-Control-Allow-Origin', '*'); 
    res.setHeader('Content-Type', 'application/json'); 
    //var parsed = JSON.parse(data); 
    var msg = {}; 
    for(product in data){ 
    db.insert(data[product], function (err, body, headers) { 
     if (!err) { 
      msg.msg = 'success!'; 
      console.log(JSON.stringify(msg); 
     } 

     else { 
      msg.msg = 'Error on insert, maybe the item already exists: ' + err 
      console.log(JSON.stringify(msg); 
     } 

    }); 

}}

我已經嘗試不同的千頭萬緒。我基本上想要的是服務器端的對象,我可以遍歷並插入到雲數據庫中,每個對象都作爲單獨的文檔。我嘗試了JSON.stringify和JSON.parse的許多組合。使用解析已經沒有運氣,因爲我得到一個錯誤說SyntaxError:意外的令牌o我讀,這意味着它已經是一個對象,但我不能以任何方式訪問數據(數據[0],數據。名稱,數據[0] .name,服務器端沒有任何內容)。我也嘗試以不同的方式從客戶端發送JSON(在ajax中 - 數據:JSON.stringify({prod:products})並且仍然沒有運氣。

在服務器端擁有json上面)以正確的順序插入文檔,問題是當我將同一個json發送到ajax文章和跨域服務器上時,我無法獲得該json,任何想法或幫助都將非常感謝,謝謝

解決方案:

我最終把對象到另一個陣列和使用發送到服務器下面是在客戶端的工作AJAX,注意數據:{數據:產品}那它幹了什麼對我來說,下面是專業人士管道json以及如何在nodejs服務器端訪問它。

$.ajax({ 
    type: 'POST', 
    url: 'url/', 
    crossDomain: true, 
    data: {data:products}, 
    dataType: 'json', 
    contentType: "application/x-www-form-urlencoded", 
    success: function(responseData, textStatus, jqXHR) { 
     var end = new Date().getTime(); 
     var millis = (end - start); 
     var duration = (millis/1000); 
     alert(responseData.msg +'Duration(seconds): ' + duration); 
    }, 
    error: function (responseData, textStatus, errorThrown) { 
     alert('POST failed. ' + JSON.stringify(responseData) + " status: " + textStatus + " Error: " + errorThrown); 
    } 
}); 

var products = [ 
{ 
    name: 'War Room Table', 
    year: '2005', 
    color: 'tan', 
    country: 'USA', 
    description: 'A Beautiful War Room table. Includes all 4 legs!', 
    usaDollarPrice: 150 
}, 
{ 
    name: 'Power Strip', 
    year: '2000', 
    color: 'white', 
    country: 'USA', 
    description: 'A very old power strip, may or may not protect against power surges.', 
    usaDollarPrice: 16 
}]; 

以下是如何在服務器端訪問它的方法。請記住,這是所有跨域Post,但應該以其他方式工作。

exports.create = function(req, res) { 
    var body = req.body; 
    //body.data[0] will get you the first object in the json, in this case it will be the war room table. 
    //If you use console.log to see it make sure you JSON.stringify(body.data[0]) or else you wil see [Object] [Object] 

也很重要,這包括在服務器/ app.js擴展:真正的部分是很重要的。 Example

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

使用:'contentType:「application/json; charset = utf-8」' – SuperSaiyan 2014-12-11 05:14:30

+0

嗨Thrustmaster你的意思是用application/json - application/x -www-FO RM-url編碼。如果沒有x-www-form-urlencoded – 2014-12-11 05:39:43

+0

,我不認爲這個安靜的通話是可行的。順便說一句,一個安穩的調用與你發送的數據的編碼無關,就像它與實際資源一樣。我沒有和Node一起工作過,但我很確定它無法使用Content-Type頭中提到的百分位編碼解碼JSON數據。 – SuperSaiyan 2014-12-11 06:36:57

回答

1

其發送到節點服務器之前被字符串化JSON數據,只嘗試 data:products您還需要節點模塊body-parser使用它,你會能夠通過ajax訪問POST數據,請參閱this也可使用

+0

哎謝謝,在形成JSON到第二個數組,併發送沒有stirngify數據解決了我的問題。 – 2014-12-11 20:05:28