2011-02-17 170 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 :-) –