0

Web 上の JavaScript コードから Node.js のサーバーへの単純な接続 (要求 - 応答) を実行しようとしています。

私は次のようにリクエストをしようとしました:

var request = new XMLHttpRequest();
request.open('GET', 'http://localhost:4444/', false);
request.send(); 

if (request.status === 200) {
  console.log(request.responseText);
}

このコードを実行すると、FireBugでエラーが発生しました

検索を続けたところ、このメソッドは同じドメインで GET リクエストを作成するためだけのものであることがわかりました。クロスドメイン リクエストを作成するには、他の戦略を使用する必要があります。

私はjQueryメソッドを見つけました、そして私は正しい道を進んでいるようです:

$.get(
    'http://localhost:4444/',
    function(data) {
        alert("sucess"); 
        //Do anything with "data"
    }
);

この場合、エラーなしで同じ応答が得られます。

動作しているように見えますが、「アラート」メッセージは表示されません! 何が起こるのですか?私は何を間違っていますか?

Node.js サーバー コードは次のとおりです。

var http = require("http");

http.createServer(function(request, response) {
    response.writeHead(200, {"Content-Type": "text/html"});
    response.write("Response");
    response.end();
}).listen(4444);
4

3 に答える 3

2

したがって、クロスドメインの問題が発生しています。いくつかのオプションがあります:

1) ノードを使用しているため、 socket.io を使用します。クロスドメイン対応です。

クライアントで:

<script src="Full path to were socket IO is held on your server//socket.io.js"></script>
<script>
    var socket = io.connect();

    socket.on('some_callback', function(data){
        // receive data
    });

    socket.emit('some_other_callback', {'data': value}); //send data
</script>

サーバ:

var io = require('socket.io').listen(server);

// define interactions with client
io.sockets.on('connection', function(socket){
    //send data to client
    socket.emit('some_callback', {'data': value});

    //recieve client data
    socket.on('some_other_callback', function(data){
        //do something
    }); 
});

2) GET を使用したいだけなので、JSONP を使用できます

$.getJSON('url_to_your_domain.com/?callback=?&other_data=something,
    function(data){
        //do something
    }
);

ここでは、通常の GET パラメータと callback=? を渡します。サーバーから以下を返します。

require('url');
var r = url.parse(req.url,true);
r.query.callback + '(' + some JSON + ')'

3) すべてのブラウザー互換性を気にしない場合は、CORS を使用できます。ここに書くよりもはるかに優れた例を見ることができます。

于 2012-08-08T23:45:41.443 に答える
1

クロスドメイン ajax には、サーバーからの特別なサポートが必要です。

いずれかの CORS: http://en.wikipedia.org/wiki/Cross-origin_resource_sharing まだすべてのブラウザーがサポートしているわけではありません。要求と応答の両方に、1 つのドメインが他のドメインとの通信を許可されていることと、どのデータについての通信が許可されているかをブラウザーに伝える特別なヘッダーが含まれます。

または JSONP: http://en.wikipedia.org/wiki/JSONP これはどこでも動作しますが、いくつかの実装制限があります。これには、必要なデータを実行して渡す JavaScript 関数コールバックで応答をラップするサーバーが含まれます。

いずれにせよ、これらのアプローチごとにサーバーをセットアップする必要があります。

于 2012-08-08T23:41:20.307 に答える
0

あなたの問題はSame Origin Policyだと思います。ブラウザは、node.js インスタンスから Web ページを取得する必要があります。

それ以外の場合は、CORSなどを使用する必要があります。SO: Ways to avoid the same-origin policyに関する良い質問もあります。

于 2012-08-08T23:39:51.303 に答える