2011-02-17 70 views
1

我一直在使用編寫的http服務器接收到節點服務器響應節點JS問題用ajax post請求

var sys = require("sys"), 
    http = require("http"), 
    url = require("url"), 
    path = require("path"), 
    fs = require("fs"); 



http.createServer(function(request, res) { 

    var parsed_url = url.parse(request.url); 
    var uri = parsed_url.pathname; 
    if(uri === "/test"){ 

    res.writeHead(200, {'Content-Type': 'text/javascript'}); 

     request.addListener('data', function (chunk) { 
      var data = eval("(" + chunk + ")"); 
      console.log(data[0].id); 
     }) 
     request.addListener('end', function() { 
      console.log('end triggered'); 
      res.write("Post data"); 
      res.end(); 
     }); 
    } 
}).listen(8080); 

,我試圖發回Ajax請求的響應,但我無法收到任何迴應。這裏是你必須以不同的方式來讀取數據的Ajax請求的代碼,

var myhttp = new XMLHttpRequest(); 
    var url = "http://localhost:8080/test"; 

    var data = [{"a":"1"},{"b":"2"},{"c":"3"}]; 

    var dataJson = JSON.stringify(data); 
    myhttp.open('POST', url, true); 
    myhttp.send(dataJson); 
    myhttp.onreadystatechange = function() {   
     if ((myhttp.readyState == 4) && (myhttp.status == 200)){ 
      alert(myhttp.responseText); 
     } 
     else if ((myhttp.readyState == 4) && (myhttp.status != 200)) 
     { 
      console.log("Error in Connection"); 
     } 

誰能幫我什麼,我做錯了......

感謝 維奈

+0

也在鉻我得到錯誤:原始null是不允許的Access-Control-Allow-Origin。 –

回答

2

。發佈的數據以大塊(「數據」事件)的形式到達節點服務器,必須收集直到「結束」事件觸發爲止。在此活動中,您可以訪問您的有效負載。

var body = ''; 

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

request.addListener('end', function() { 
    console.log(body); 
    res.write('post data: ' + body); 
}); 

Additionaly,似乎有一些問題(特別是關於狀態代碼檢查)您的客戶端代碼,但我真的不能幫你的,因爲我總是與框架,如jQuery工作管理異步請求。

如果您想構建可靠的node.js服務器以供Web使用,我強烈建議您使用高性能HTTP-Framework Express。在節點中開發基於Web的服務器應用程序時,它會帶走很多痛苦,並且會被主動維護。

+0

通過用res.writeHead(200,{'Content-Type':'text/javascript','Access-Control-Allow-Origin':'*'})替換標題可以解決該問題。但知道問題是它不適用於鉻錯誤是:請求標頭字段內容類型是不允許的訪問控制允許標題 –

3

你的代碼幾乎是正確的,但在你的代碼示例,你有

console.log(data[0].id) 

數據對象有沒有財產ID所以如果你只有

console.log(data[0]) 

有你有類似

{ a: '1' } 

因此您可以通過訪問屬性一個

console.log(data[0].a); 

修訂更新了一個完整的例子

一件事是,你正在使用EVAL和節點自帶JSON .parse捆綁它,所以下面的片段是我如何使它工作

Fi樂:app.js

var sys = require("sys"), 
    http = require("http"), 
    url = require("url"), 
    path = require("path"), 
    fs = require("fs"); 



http.createServer(function(request, res) {  
    var parsed_url = url.parse(request.url); 
    var uri = parsed_url.pathname; 

    if(uri === "/test"){ 

     res.writeHead(200, {'Content-Type': 'text/javascript'}); 
     request.addListener('data', function (chunk) { 
      // removed this - eval("(" + chunk + ")"); 
      var data = JSON.parse(chunk);  
      console.log(data[0].a); 
     }) 
     request.addListener('end', function() { 
      console.log('end triggered'); 
      res.write("Post data"); 
      res.end(); 
     });    

    } else if(uri === "/") { 
     fs.readFile("./index.html",function(err, data){ 
     if(err) throw err; 
      res.writeHead(200, {'Content-Type': 'text/html'}); 
      res.end(data); 
     });  
    } 

}).listen(8080); 

放在同一目錄下創建一個具有以下一個index.html文件:

<html> 
<head> 
    <script type="text/javascript" charset="utf-8"> 
     var myhttp = new XMLHttpRequest(); 
     var url = "http://localhost:8080/test"; 

     var data = [{"a":"1"},{"b":"2"},{"c":"3"}]; 
     var dataJson = JSON.stringify(data); 

     myhttp.open('POST', url, true); 
     myhttp.send(dataJson); 
     myhttp.onreadystatechange = function() {   
      if ((myhttp.readyState == 4) && (myhttp.status == 200)){ 
       alert(myhttp.responseText); 
      } 
      else if ((myhttp.readyState == 4) && (myhttp.status != 200)) 
      { 
       console.log("Error in Connection"); 
      } 
     } 
    </script> 
</head> 
<body> 
</body> 
</html>  

這就是你想要什麼一個完整的工作示例。

關於您遇到的相同原產地政策問題,主要是因爲您無法通過ajax在2個不同的域之間發佈數據,除非您使用iframe的一些技巧,但這是另一回事。

此外,我認爲任何人都應該理解技術的骨幹,然後才能進入如此公平地發揮您的框架。

祝你好運

+0

嘿,它工作在Firefox上時,我用res.writeHead(200,{ \t \t \t '內容類型': '文本/ JavaScript的', \t \t \t '訪問控制允許來源': '*' \t \t});但在鉻我得到error-request頭字段Content-Type是不允許的Access-Control-Allow-Headers。你有任何線索如何解決在鉻。 –

+0

正在同一主機和端口上運行示例嗎?如果不是的話,當你發出ajax請求時,你必須使用** jsonp **。 –

+0

感謝Joao,實際上問題是需要爲基於webkit的瀏覽器設置請求標頭的權限,因此在響應標頭中執行Access-Control-Allow-Headers - 'Content-type'解決了這個問題。當webkit打破了ajax請求在兩個部分..所以這解決了看到webkit cors :-) –