2013-04-18 110 views
4

我使用Express 3.0和節點v0.11.0。我有一個提交表單的按鈕,我使用ajax將該數據作爲JSON對象發佈到我的節點服務器。
的客戶端代碼:錯誤的請求 - 節點js ajax後

$('#contact').submit(function(e) { 
console.log('submit called'); 
var formData = JSON.stringify($('form').serializeObject()); 
console.log(formData); 

$.ajax({ 
    url: "http://localhost:3000/savedata/", 
    type: "POST", 
    dataType: 'json', 
    data: {objectData: formData}, 
    contentType: "application/json", 
    complete: function() { 
     console.log('process complete'); 
    }, 
    success: function(data) { 
     console.log('process sucess'); 
    }, 
    error: function() { 
     console.log('process error'); 
    }, 
    }); 
return false; 
}); 

然後我的服務器上:

var express = require('express'); 
var app = express(); 
app.set('views', __dirname + '/views'); 
app.set('view engine', 'jade'); 
app.use(express.bodyParser()); 
app.use(express.cookieParser()); 
app.use(express.static(__dirname + '/public', {maxAge: 86400000})); 
app.engine('.jade', require('jade').__express); 

app.post('/savedata', function(req, res) { 
    console.log('savedata called'); 
    console.log(req.body); 
    //var resultObject = JSON.parse(req.body.objectData); 
    //console.log(resultObject); 
    res.end(); 
}); 

,我現在面臨的問題是,當我使用express.bodyParser()中間件,我得到一個:

Error: Bad Request 
at next (/home/captain/data/lemontreecakes/node_modules/express/node_modules/connect/lib/proto.js:125:13) 
at /home/captain/data/lemontreecakes/node_modules/express/node_modules/connect/lib/middleware/bodyParser.js:54:23 
at IncomingMessage.<anonymous> (/home/captain/data/lemontreecakes/node_modules/express/node_modules/connect/lib/middleware/json.js:74:60) 
at IncomingMessage.EventEmitter.emit (events.js:92:17) 
at _stream_readable.js:883:14 
at process._tickCallback (node.js:415:13) 

這是我的瀏覽器控制檯輸出:

submit called load.js:33 
{"name":"tes","email":"[email protected]"} load.js:36 
POST http://localhost:3000/savedata/ 400 (Bad Request) jquery-1.9.1.min.js:5 
process error load.js:54 
process complete 

所以我知道我正在向我的服務器提交數據。如果我刪除節點服務器身體解析器中間件,然後我得到

savedata called 
TypeError: Cannot read property 'objectData' of undefined 

我在想,我不能正常發送JSON數據到服務器。任何提示將不勝感激。

+0

不要在表單數據上使用'JSON.stringify',而是直接將序列化表單數據作爲'data'參數傳遞。 – CBroe

回答

2

我不能完全肯定這是否解決了問題,但試試這個:

$.ajax({ 
    ... 
    data: JSON.stringify({ "objectData": formData}), 
    ... 
+0

謝謝你這個作品。正如古斯塔夫指出的,我需要發送一個強壯的JSON對象到服務器,並且由於我的服務器正在執行JSON.parse(req.body.objectData),所以我需要發送一個objectData。 – Nilath

2

試試這個代碼,而不是:

$.ajax({ 
     url: "/savedata/", 
     type: "POST", 
     data: formData, 
     contentType: "application/json", 
     success: function(data) { 
      alert('success'); 
     }, 
     error: function() { 
      alert('error'); 
     } 
    } 
); 
  • 首先,基於瀏覽器的AJAX可不做跨域HTTP請求(例如,您的網站localhost:3000可能不會向google.comlocalhost:3000以外的任何網站發出AJAX請求)。所以如果你真的想這樣做,讓你的服務器處理它。

    否則,由於99%的時間,只需使用相對URL(/savedata/)。

  • 此外,還要確保你只發送一個字符串化JSON對象,而不是一個 JSON對象。

    例如'{"test" : 1}'不是{"test" : 1}。所以在你的情況下,字符串化的對象是formData。

我沒有試過這個代碼與節點服務器上的示例數據,它工作正常。如果你有任何額外的問題,隨時問。

我也可以給你的代碼,如果你想要它。

+0

感謝隊友,現在我意識到我必須發送字符串化的JSON對象。我打算做這個跨域HTTP請求,我正在讀取設置dataType爲'jsonp'應該做的伎倆。 – Nilath