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

时间:2011-02-17 07:45:08

标签: javascript ajax node.js

我使用节点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");
        }

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

由于 维奈

2 个答案:

答案 0 :(得分:3)

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

console.log(data[0].id)

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

console.log(data[0])

你有像

这样的回复
{ a: '1' }

因此,您可以通过

访问 a 属性
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); 

在同一目录中创建一个文件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的一些技巧,但这是另一个故事。

此外,我认为任何人都可以在进入框架之前理解技术的支柱,这对你来说是公平的。

祝你好运

答案 1 :(得分:2)

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

var body = '';

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

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

另外,您的客户端代码似乎存在一些问题(特别是关于状态代码检查),但我无法真正帮助您,因为我总是使用jQuery等框架来处理管理异步请求。

如果您想构建可靠的node.js服务器供Web使用,我强烈推荐使用高性能HTTP-Framework Express。在节点中开发基于Web的服务器应用程序时,它会消除很多痛苦,并且会得到积极维护。