11

ローカルPCでアプリを開発しています。フロントエンドはspinejsで構築し、バックエンドAPIはnode.jsで構築する必要があります。Spineはポート9294で実行され、node.jsはポート3000で実行されています。Spineでは、モデルに次のように追加しました。

@url: "http:localhost:3000/posts"

と私のエクスプレスサーバーで

app.get('/posts', function(req, res){
  console.log("giving ALL the posts");
  res.header("Access-Control-Allow-Origin", "*")
  res.json(posts);
});

しかし、私は常に次のエラーをクロムで取得しています:

XMLHttpRequest cannot load http://localhost:3000/posts. Origin http://localhost:9294 is not allowed by Access-Control-Allow-Origin.

APIに正しくアクセスできるようにするにはどうすればよいですか?応答にヘッダーを追加しても問題は解決しますが。

4

2 に答える 2

16

app.getリクエストにのみ応答しGETます。ブラウザがリクエストをプリフライトしている場合OPTIONS、Expressにはそれらのリクエストのリスナーがないため、エラーが送信されます。あなたのコードに加えてこのコードを追加してみて、それが機能するかどうかを確認してください:

app.options('/posts', function(req, res){
  console.log("writing headers only");
  res.header("Access-Control-Allow-Origin", "*");
  res.end('');
});

withcredentials=trueまた、リクエスト( )でCookieを送信している場合、Access-Control-Allow-Originヘッダーを。にすることはできません。これは、ブラウザがajaxリクエストに自動的に追加するヘッダー*の正確な値である必要があります。Origin

res.header("Access-Control-Allow-Origin", req.headers.origin);

これはセキュリティ上の理由からです。Cookieが必要なことをしている場合は、 CSRF攻撃originを回避するために、が許可されたWebサイトであることを実際に確認する必要があります。

于 2012-04-10T02:25:41.163 に答える
15

このミドルウェアは、Expressを使用したCORSを可能にします。重要なのは、プリフライトリクエストを検出しOPTIONS、応答を返して404またはデータベースクエリの重複を回避することです。リソースを参照してください:http://cuppster.com/2012/04/10/cors-middleware-for-node-js-and-express/

var methodOverride = require('method-override');
app.use(methodOverride());

// ## CORS middleware
// see: http://stackoverflow.com/questions/7067966/how-to-allow-cors-in-express-nodejs
var allowCrossDomain = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');

    // intercept OPTIONS method
    if ('OPTIONS' == req.method) {
      res.send(200);
    }
    else {
      next();
    }
};
app.use(allowCrossDomain);
于 2012-11-29T14:48:48.730 に答える