0

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

控制台日志显示节点代码运行良好,到达 res.end() 但 ajax 不断报告错误或超时错误,而不是调用成功回调方法。

代码的关键部分是:

前端

<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"} 但这也会导致错误。我弄乱了内容类型吗?那会有多大的影响?

任何帮助,将不胜感激。

4

2 回答 2

1

您发出请求的方式实际上是跨域请求并且违反了同源策略,因此 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。如果您必须在不使用 express 框架的情况下在纯 nodejs 中执行此操作,那么您可以查看以下链接。

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

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

于 2013-04-27T10:54:51.670 回答
0

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

{"a":"b"}

或者:

JSON.stringify({a: 'b'})
于 2013-04-27T02:49:48.417 回答