6

私はnode.jsで遊んでいて、エクスプレスフレームワークに出くわしました。異なるポートが使用されている場合、動作させることができないようです。

Mac で実行している MAMP サーバーであるhttp://localhost:8888に ajax があります。

$.ajax({
    url: "http://localhost:1337/",
    type: "GET",
    dataType: "json",
    data: { }, 
    contentType: "application/json",
    cache: false,
    timeout: 5000,
    success: function(data) {
        alert(data);
    },
    error: function(jqXHR, textStatus, errorThrown) {
        alert('error ' + textStatus + " " + errorThrown);
    }
});

ご覧のとおり、私の node.js サーバーはhttp://localhost:1337/で実行されています。その結果、何も返されず、エラーがスローされます。

これを回避する方法はありますか?

ありがとう

ベン

4

1 に答える 1

7

あなたが抱えている問題は、クロスオリジンリクエストを作成しようとしていて、それがブラウザーで許可されていないことです (はい、異なるポートを持つ同じホスト名は、この目的では異なるオリジンとしてカウントされます)。ここには 3 つのオプションがあります。

1. リクエストをプロキシします。

できればこれをやってください。:8888 サーバー上で実行され、リクエストを 1337 サーバーにプロキシするコードを記述します。両方の前にプロキシを貼り付けることでこれを行うこともできます.Nginxのようなものはこれが得意で、セットアップが簡単です.

2. CORS (クロス オリジン リソース シェアリング) を使用する

参照: http://en.wikipedia.org/wiki/Cross-origin_resource_sharingおよびhttps://developer.mozilla.org/en/http_access_control

これは、応答にいくつかのヘッダーを追加して、クロスオリジン要求がここで問題ないことをブラウザーに伝えることを意味します。Express サーバーに、次のようなミドルウェアを追加します。

  function enableCORSMiddleware (req,res,next) {
     // You could use * instead of the url below to allow any origin, 
     // but be careful, you're opening yourself up to all sorts of things!
     res.setHeader('Access-Control-Allow-Origin',  "http://localhost:8888");
     next()
  }
 server.use(enableCORSMiddleware);

3.JSONP を使用する

これは、「AJAX」応答を Javascript コードとしてエンコードするトリックです。次に、ブラウザにそのコードをロードするように依頼すると、ブラウザはスクリプトをクロスオリジンで喜んでロードするため、クロスオリジンの問題を回避できます。それはまた、他の誰でもそれを回避できるようにするので、それがあなたが望むものであることを確認してください!

サーバー側では、応答を Javascript 関数呼び出しでラップする必要があります。次のように「jsonp コールバック」オプションを有効にすると、Express でこれを自動的に行うことができます。

server.enable("jsonp callback");

次に、応答の「json()」メソッドを使用して応答を送信します。

server.get("/ajax", function(req, res) {
    res.json({foo: "bar"});
});

クライアント側では、dataType オプションで「json」を「jsonp」に変更するだけで、jQuery で JSONP を有効にできます。

dataType: "jsonp", 
于 2012-04-22T20:01:51.160 に答える