2016-09-30 198 views
1

我正在使用AJAX POST數據到服務器使用Node.js代碼。很簡單,這個測試項目中有兩個文件。這裏是main.htmlAJAX發送數據到Node.js服務器

<!DOCTYPE HTML> 
<html> 
    <head> 
    </head> 
    <body> 
     <script> 
      var xhr = new XMLHttpRequest(); 
      xhr.open('POST', '/', true); 
      xhr.send('hello'); 
     </script> 
    </body> 
</html> 

這裏的服務器代碼:

const http = require('http'); 

http.createServer(function(req,res) { 
    console.log(req.body); 
}).listen(3000); 

也許,你已經知道,服務器將console.log() '未定義'。 所以問題是爲什麼它'未定義'?如何獲得服務器上的AJAX數據?

我知道this question的其他解決方案。

你能幫助我任何其他方式來方便地獲取數據嗎?

+0

您是否爲''/''定義了任何路線? – abdulbarik

+0

@abdulbarik謝謝,我認爲http.createServer會收到任何請求。不管路線如何。 – suoyong

回答

3

您已經創建的服務器還好吧,但有兩個問題:

  1. 連接端點。你的AJAX是POST,所以你需要正確解析POST請求(不完全解決你的問題,但你需要區分請求方法)。
  2. Node.js的默認情況下不解析您POST的身體,你需要告訴它,它是如何做的,通過使用querystring模塊,例如。

兩者結合,這樣的:

var qs = require('querystring'); 

http.createServer(function(req, res) { 
    if (request.method == 'POST') { 
     var body = ''; 

     request.on('data', function(data) { 
      body += data; 
     }); 

     request.on('end', function() { 
      var post = qs.parse(body); 

      // Use your POST here 
      console.log(post); 
     }); 
    } 
}).listen(3000); 

JSON數據 - 清潔的解決方案:

你需要用JSON編碼您的AJAX的數據,比解析它在服務器端像這樣:

http.createServer(function(req,res) { 
    if (req.method == 'POST') { 
     var jsonPost = ''; 

     req.on('data', function(data) { 
      jsonPost += data; 
     }); 

     req.on('end', function() { 
      var post = JSON.parse(jsonPost); 

      // Use your POST here 
      console.log(post); 
     }); 
    } 
}).listen(3000); 

你會更好使用Express.js框架,與它的bodyParser模塊。


更新 - 塊是如何緩衝:

考慮簡單的例子 - 在xhr.send()發送文本的量,超過Content-Length。比起做data事件如下:

req.on('data', function(data) { 
    console.log(data); 
    body += data; 
}); 

你會看到類似這樣的:

<Buffer 0a 0a 4c 6f 72 65 6d 20 69 70 73 75 6d 20 64 6f 6c 6f 72 20 73 69 74 20 61 6d 65 74 2c 20 63 6f 6e 73 65 63 74 65 74 75 72 20 61 64 69 70 69 73 63 69 ... > 
<Buffer 65 74 20 71 75 61 6d 20 63 6f 6e 67 75 65 20 6c 6f 62 6f 72 74 69 73 2e 20 50 65 6c 6c 65 6e 74 65 73 71 75 65 20 74 65 6d 70 75 73 20 75 6c 6c 61 6d ... > 
<Buffer 61 2e 20 56 69 76 61 6d 75 73 20 76 69 74 61 65 20 61 6e 74 65 20 6d 65 74 75 73 2e 20 4d 61 75 72 69 73 20 71 75 69 73 20 61 6c 69 71 75 65 74 20 65 ... > 

這表明,在大塊收到data事件的數據。只有在end事件中,您纔會收到發送的全部數據(如果您在此之前彙總了它)。 Node.js不處理這個問題,這就是爲什麼你需要第三方模塊。

也就是說 - 你不能只得到req.body的請求,因爲它根本沒有設置

+0

非常感謝你的詳細解釋。但是,如何直接獲取數據。如使用'req.body'獲取身體。 – suoyong

+0

我懇求你的另一個答案。當我使用express框架以及需要('body-parse')並將其用作中間件時。但是當我使用表單(

)後,服務器將控制數據。相反,當我使用ajax發佈數據時,服務器控制檯什麼都沒有? – suoyong

+0

因爲它處理的數據是用AJAX以塊形式發送的,而你的工作就是緩衝它。這只是Node工作的方式。使用模塊解析POST,不用擔心。 – Nevertheless