2

socket.ioサポートを追加するノード.jsExpressサーバーが機能しています(javascriptクライアントがsocket.io経由で接続できるようにします)。Javascript $ .get()を介してエクスプレスサーバーに接続できますが、CORSエラーが原因でsocket.io.connect()コマンドが失敗します。

私のテストマシンは、クライアントにサービスを提供するApacheを備えたOSXであるため、ポート80が使用されるため、node.js/expressをポート8888で実行しています。ドキュメントに従ってsocket.ioを追加しました。

var exp = express();
var server = require('http').createServer(api.server);
exp.listen(8888);

var io = require('socket.io').listen(server);
io.sockets.on('connection', function(socket) {
     console.log('connection'); 
});

node.jsログに「info:socket.iostarted」が正しく表示されます。

次に、クライアントで、サーバーに接続しようとします...

    this.socket = io.connect('http://localhost:8888');
    this.socket.on('connect',function() {
        socket.emit('install','test');
    });

ただし、ChromeのコンソールでCORSエラーが発生します。

XMLHttpRequest cannot load http://localhost:8888/socket.io/1/?t=1358715637192. Origin http://localhost is not allowed by Access-Control-Allow-Origin.

ただし、これは正常に機能します。

    $.get('http://localhost:8888',function(e,d){
        console.log(e,d); 
    });

そこで、localhost:8888とlocalhostの両方について、ヘッダーを再確認しました。どちらも、クロスドメイン要求を許可する(必要がある)ヘッダーを適切に返しています...

Access-Control-Allow-Origin:*

ここに画像の説明を入力してください

何か案は?

4

1 に答える 1

0

CORS を機能させるには非常にトリッキーなものです (または、少なくとも私にとってはそうでした)。このリソースをお勧めします: http://enable-cors.org/

彼らが何をするかを非常に注意深く追跡することは、私を助けてくれました。また、ブラウザーが異なれば、CORS 要求/応答に対する可視性も異なり、これが役に立ったこともわかりました。

Chrome は Firefox よりも簡単に作業できることがわかりましたが、firebug などの Firefox ツールは非常に使いやすかったです。

あなたの情報からの私の直感は、リクエスト属性に X-Request-With を含めるためにリクエストが必要になる可能性があるということです。

また、フィドラーを使用して http リクエストを送信すると、問題を最初にサーバー側に絞り込み、それを機能させることができることもわかりました。ブラウザーは CORS を強制することがわかりますが、フィドラーのようなものはそうではなく、何が起こっているのかを検査する別の方法を提供します。

期待どおりに動作していないのがサーバー側なのかクライアント側なのかを確認できるように、問題を半分に分割することをお勧めします。

私の問題は、OPTIONS ヘッダーに対して POST または GET と同じ CORS 応答を返すことに関連していました。それは間違っていました。クロムはそれを許可しました。Firefoxはしませんでした。送信されたオプション要求はすべて一度送信され、その後はキャッシュされ、再送信されません (これにより、最初は多くの混乱が生じました)。オプションのリクエストについては、続行してもよいという標準的な応答が必要なだけです。その後、投稿または応答の取得で、cors 応答のみが必要だと思います。

于 2013-01-20T22:01:40.097 に答える