0

2 つのテキスト領域を持つページがあり、そのうちの 1 つからノードに (ajax を使用して) データを送信したい場合、ノードは何らかの処理を行い、応答を返し、それが 2 番目のテキスト領域に取り込まれます。

コンソール ログは、ノード コードが 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);

node が行うことのほとんどを取り除き、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を使用することです。エクスプレス フレームワークを使用せずに純粋な nodejs でこれを行う必要がある場合は、以下のリンクを確認してください。

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

これにより、クエリに関する詳細な説明も得られます。

于 2013-04-27T10:54:51.670 に答える