1

REST経由でデータを公開するExpressJSアプリケーションがあります。同じオリジンから、または curl を使用して REST インターフェイスにアクセスすると、すべて問題なく、カスタム http ヘッダーがルートに転送されます。

しかし、別のオリジンから REST インターフェイスにアクセスしようとすると、ヘッダーが削除されます。

Expressjsの構成は次のようになります

app.use(express.bodyParser());

var allowCrossDomain = function(req, res, next) {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Methods', 'GET');
  res.header('Access-Control-Allow-Headers', 'Accept');

  if ('OPTIONS' == req.method) {
    res.send(200);
  }
  else {
    next();
  }
};
app.all('/',allowCrossDomain);
app.get('/foo', function(req,res){
  console.dir(req.headers);
});

次のJSコードを使用してAPIにアクセスしようとしています

var properties = {
    url: 'http://localhost:3001/foo?callback=?,
    type: 'GET',
    dataType: 'jsonp',
    headers: { "x-foo" : "FooBar"}
};
$.ajax(properties).done(onSuccess).fail(function(r, s, e) {
  console.log(e);
});

サーバー側では、カスタム ヘッダー x-foo は req.headers の一部ではありません。次のcurlコマンドを使用すると、ヘッダーが存在します

curl -H "x-foo: FooBar" -G http://localhost:3001/foo

残念ながら、これを起動して実行するための解決策を見つけることができません。

4

1 に答える 1

2

あなたのライン

app.all('/', ...);

あなたが思うかもしれないことをしません。すべての着信要求を処理するわけではありません。/使用されている動詞に関係なく、 のすべての着信要求を処理するだけです。したがって、すべてのルートではなく、すべての動詞allを意味します。詳細については、そのドキュメントを参照してください。

/fooしたがって、呼び出しを使用してアクセスしようとする$.ajaxと、CORS ミドルウェアはトリガーされません。もしかしたら、これが原因かもしれません。少なくとも、これは localhost およびcurlからは機能するが、別のドメインを使用するブラウザー内からは機能しない理由を説明できます。

お役に立てれば。

PS: 独自の CORS ミドルウェアを作成するのではなく、既存のものを使用することをお勧めします。私はnode-corsで非常に良い経験をしました。

于 2013-07-04T10:17:39.460 に答える