response.end()似乎没有在节点操作后触发

时间:2013-04-27 02:46:50

标签: jquery ajax node.js

我有一个包含两个文本区域的页面,我想将其中一个数据提交到节点(使用ajax),然后节点执行一些处理,然后返回响应,然后将响应填充到第二个文本区域。

控制台日志显示节点代码工作正常,它到达res.end()但是ajax不断报告Error或TimeoutError,而不是调用成功回调方法。

代码的关键部分是:

前端

<script>
      function processClick() {

          var data = {};
          data.topic = document.getElementById("topic").value;
          data.message = document.getElementById("request_area").value;

         $.ajax({
              url: 'http://localhost:8888/',
              dataType:'json',
              type: 'POST',
              data: JSON.stringify(data),
              timeout: 2000,
              success: function(data) {
                   $("#response_area").append(data);                            
              },
              error: function(jqXHR, textStatus, errorThrown) {
                   $("#response_area").append('[Error[textstatus=' + textStatus + ',errorThrown=' + errorThrown + ']]');
              }
         });
      }

</script>

节点

var port = 8888;
var http = require('http');


http.createServer(function (req, res) {
    response = null;
    console.log('request received');
    res.writeHead(200, {'Content-Type': 'application/json'});

    res.end('{a:"b"}');

}).listen(port);

console.log("listening on " + port);

我已经删除了大部分节点所做的事情,并试图让它只返回一个json字符串{a:“b”},但这也会导致错误。我搞乱了内容类型吗?会产生多大的影响?

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

您提出请求的方式实际上是跨域请求并违反same origin策略,因此jQuery ajax调用失败。要使此跨域工作,您应该使用基于JSONP的格式。

例如node.js代码:

var port = 8888;
var http = require('http');


http.createServer(function (req, res) {
    response = null;
    console.log('request received');
    res.writeHead(200, {'Content-Type': 'application/json'});
    res.end('_testcb(\'{"a": "b"}\')');

}).listen(port);

console.log("listening on " + port);

和客户端javascript应该是这样的

<script>
      function processClick() {

          var data = {};
          data.topic = document.getElementById("topic").value;
          data.message = document.getElementById("request_area").value;

         $.ajax({
              url: 'http://localhost:8888/',
              dataType:'jsonp',
              type: 'POST',
              jsonpCallback: "_testcb",
              data: data,
              success: function(data) {
                   $("#response_area").append(data);                            
              },
              error: function(jqXHR, textStatus, errorThrown) {
                   $("#response_area").append('[Error[textstatus=' + textStatus + ',errorThrown=' + errorThrown + ']]');
              }
         });
      }

</script>

在同一个域内执行此操作的最佳方法是使用express。如果您必须在纯nodejs中执行此操作而不使用快速框架,那么您可以查看以下链接。

https://stackoverflow.com/a/6012543/517525

这也为您提供了有关查询的详细说明。

答案 1 :(得分:0)

您的JSON字符串无效。需要引用密钥:

{"a":"b"}

或者:

JSON.stringify({a: 'b'})