使用ajax post请求接收来自节点服务器的响应问题

我写了一个使用节点js的http服务器

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"); } 

任何人都可以帮助我,我做错了什么…

谢谢Vinay

       

网上收集的解决方案 "使用ajax post请求接收来自节点服务器的响应问题"

您必须以不同的方式读取数据。 发布的数据以大块(“数据”事件)到达节点服务器,必须收集直到“结束”事件触发为止。 在这个事件中,您可以访问您的有效载荷。

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

另外,你的客户端代码似乎有一些问题(尤其是关于状态码检查),但是我不能真正帮助你,因为我总是使用jQuery等框架来pipe理asynchronous请求。

如果您想构build可靠的node.js服务器以供Web使用,我强烈build议使用高性能的HTTP-Framework Express 。 在节点中开发基于Web的服务器应用程序时,它会带走很多痛苦,并且会被主动维护。

你的代码几乎是正确的,但在你的代码示例

 console.log(data[0].id) 

数据对象没有属性ID,所以如果你只有

 console.log(data[0]) 

在那里你有一个响应

 { a: '1' } 

因此您可以通过做访问该属性

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

更新了一个完整的例子

还有一件事是你正在使用eval和节点来与JSON.parse捆绑它,所以下面的片段是我如何使它工作

文件: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); 

在同一个目录下用以下命令创build一个文件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在两个不同的域之间发送数据,除非您使用iframe的一些技巧,但这是另一回事。

另外,我认为任何人都可以理解一个技术的骨干,然后再进入如此公平的发挥你的框架。

祝你好运