2015-11-13 357 views
1

我試圖向一個節點服務器發送一個post請求。 這是我的客戶端代碼:jQuery + node.js表示POST請求

function send(userid,message){ 
    $.ajax({ 
     method: "POST", 
     url: "/chat/messages?id="+userid+'&message='+message 
    }) 
    clear(); 
} 

這是我的服務器端代碼:

app.post('/chat/messages',function (req,res){ 
    var query = url.parse(req.url,true).query 
    insertMessage(query.id,query.message) 
    }) 

這工作,但我不知道使用後得到的查詢字符串中的數據是正確的要走的路。

我試圖在$ajax參數添加數據字段:

function send(userid,message){ 
    $.ajax({ 
     method: "POST", 
     url: "/chat/messages" 
     data : {'id' : userid, 'message' : message} 
    }) 
    clear(); 
} 

而在服務器端使用bodyParser()解析體內容:

app.use(bodyParser.json()) 
app.post('/chat/messages',function (req,res){ 
    console.log(req.body) 
}) 

但登錄時的響應時,body{ }對象總是空的。 這是爲什麼? POST請求需要一個<form>標記嗎?

我試着編輯我的ajax請求,使用json作爲dataType並將數據字符串化,但req.body仍然是空的。

$.ajax({ 
    method: "POST", 
    url: "/chat/messages", 
    data : JSON.stringify({'id' : userid, 'message' : message}), 
    dataType: 'json', 
}) 
+0

你不發送JSON,所以...這是錯誤的bodyparser。如果您想發送json,則需要將發送給數據參數的對象串聯起來。在這種情況下,也可以幫助設置contentType。 –

+0

,但即使使用'bodyParser.raw()',請求主體仍爲空。 –

+0

爲什麼我的問題被低估?有人能告訴我它有什麼問題嗎? –

回答

2

當您將數據發佈到服務器時,數據通常被urlencoded並添加到請求的主體中。在你的榜樣,它應該是這樣的:

id=<userid>&message=<message> 

因此,bodyparser你需要能夠解析是bodyparser.urlencoded()

app.use(bodyParser.urlencoded()) 

注意,它並不總是url編碼,這一切都取決於關於你用來發送帖子的內容。例如,AngularJS默認將其作爲json發送。好消息是,您可以簡單地添加bodyparsers,而且您的路由不需要知道使用哪種方法,因爲在這兩種情況下,數據都會以包含鍵/值對的req.body結尾。

1

您應該閱讀快遞文檔。 http://expressjs.com/api.html#req

// For regular html form data 
app.use(bodyParser.urlencoded()) 
app.post('/chat/messages',function (req,res){ 
    console.log(req.body); 
    console.log(req.query.id); 
    console.log(req.query.messages); 
}) 

你也可以做req.params

app.post('/chat/messages/:id',function (req,res){ 
    console.log(req.body); 
    console.log(req.query); 
    console.log(req.params.id) 
})