Javascript 使用ajax post请求从节点服务器接收响应时出现问题

Javascript 使用ajax post请求从节点服务器接收响应时出现问题,javascript,ajax,node.js,Javascript,Ajax,Node.js,我已经使用NodeJS编写了一个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);

我已经使用NodeJS编写了一个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

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

var body = '';

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

request.addListener('end', function() {
  console.log(body);
  res.write('post data: ' + body);
});
此外,您的客户端代码似乎存在一些问题(特别是关于状态代码检查),但我无法真正帮助您解决这些问题,因为我总是使用类似于管理异步请求的框架


如果您想构建可靠的node.js服务器供web使用,我强烈推荐使用高性能HTTP框架。在node中开发基于web的服务器应用程序时,它消除了许多痛苦,并得到了积极维护。

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

var body = '';

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

request.addListener('end', function() {
  console.log(body);
  res.write('post data: ' + body);
});
此外,您的客户端代码似乎存在一些问题(特别是关于状态代码检查),但我无法真正帮助您解决这些问题,因为我总是使用类似于管理异步请求的框架


如果您想构建可靠的node.js服务器供web使用,我强烈推荐使用高性能HTTP框架。在node中开发基于web的服务器应用程序时,它消除了许多痛苦,并得到了积极的维护。

您的代码几乎正确,但在代码示例中,您有

console.log(data[0].id)
数据对象具有no属性id,因此如果只有

console.log(data[0])
你的回答是这样的

{ a: '1' }
因此,您可以通过执行以下操作访问属性a

console.log(data[0].a);
更新了完整的示例

还有一件事是,您正在使用eval,node附带了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); 
在同一目录上创建一个文件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>       

var myhttp=newXMLHttpRequest();
变量url=”http://localhost:8080/test";
变量数据=[{a:“1”},{b:“2”},{c:“3”}];
var dataJson=JSON.stringify(数据);
myhttp.open('POST',url,true);
myhttp.send(dataJson);
myhttp.onreadystatechange=函数(){
如果((myhttp.readyState==4)和&(myhttp.status==200)){
警报(myhttp.responseText);
}
else if((myhttp.readyState==4)和&(myhttp.status!=200))
{
控制台日志(“连接错误”);
}
}
这是你想要的一个完整的工作示例

关于同源策略问题,您遇到的问题主要是因为您不能通过ajax在两个不同的域之间发布数据,除非您对iFrame使用一些技巧,但这是另一回事

此外,我认为,在进入框架之前,了解技术的主干对任何人都是有益的,这样对您来说都是公平的


祝您好运

您的代码几乎正确,但在您的代码示例中

console.log(data[0].id)
数据对象具有no属性id,因此如果只有

console.log(data[0])
你的回答是这样的

{ a: '1' }
因此,您可以通过执行以下操作访问属性a

console.log(data[0].a);
更新了完整的示例

还有一件事是,您正在使用eval,node附带了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); 
在同一目录上创建一个文件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>       

var myhttp=newXMLHttpRequest();
变量url=”http://localhost:8080/test";
变量数据=[{a:“1”},{b:“2”},{c:“3”}];
var dataJson=JSON.stringify(数据);
myhttp.open('POST',url,true);
myhttp.send(dataJson);
myhttp.onreadystatechange=函数(){
如果((myhttp.readyState==4)和&(myhttp.status==200)){
警报(myhttp.responseText);
}
else if((myhttp.readyState==4)和&(myhttp.status!=200))
{
控制台日志(“连接错误”);
}
}
这是你想要的一个完整的工作示例

关于同源策略问题,您遇到的问题主要是因为您不能通过ajax在两个不同的域之间发布数据,除非您对iFrame使用一些技巧,但这是另一回事

此外,我认为,在进入框架之前,了解技术的主干对任何人都是有益的,这样对您来说都是公平的


祝你好运

同样在chrome中,我得到了错误:Access-Control-Allow-Origin不允许使用Origin null。同样在chrome中,我得到了错误:Access-Control-Allow-Origin不允许使用Origin null。嘿,当我用res.writeHead(200,{'Content-Type':'text/javascript','Access-Control-Allow-Origin':'*'});但在chrome上,我发现访问控制允许标头不允许使用errorRequest标头字段内容类型。您知道如何在chrome中解决此问题。示例是否在同一主机和端口上运行?如果不是,则在发出ajax请求时必须使用jsonp。谢谢Joao,实际上问题是需要o为基于webkit的浏览器设置访问控制允许标头-“内容类型”在响应标头中解决了此问题。由于webkit将ajax请求分为两部分。因此,通过查看webkit cors解决了此问题:-)嘿,这很有效