node.jsのexpress.jsフレームワークでクロスオリジンリソースシェアリング(CORS)を有効にする方法


101

パブリックディレクトリから静的ファイルを提供しながら、クロスドメインスクリプティングをサポートするnode.jsでWebサーバーを構築しようとしています。私はexpress.jsを使用していますが、クロスドメインスクリプティングを許可する方法がわかりません(Access-Control-Allow-Origin: *)。

私はこの投稿を見ましたが、役に立ちませんでした。

var express = require('express')
  , app = express.createServer();

app.get('/', function (req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "X-Requested-With");
    next();
});

app.configure(function () {
    app.use(express.methodOverride());
    app.use(express.bodyParser());
    app.use(app.router);
});

app.configure('development', function () {

    app.use(express.static(__dirname + '/public'));
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

app.configure('production', function () {


    var oneYear = 31557600000;
    //    app.use(express.static(__dirname + '/public', { maxAge: oneYear }));
    app.use(express.static(__dirname + '/public'));
    app.use(express.errorHandler());
});

app.listen(8888);
console.log('express running at http://localhost:%d', 8888);

app.allとapp.getに注目してください。GETではなくOPTIONSリクエストです
Shimon Doodkin

CORSをサポートする単純なノード、静的Webサーバーの例については、local-web-serverを参照してください
Lloyd

詳細については、enable-cors.org / server_apache.htmlを参照してください
モスタファ

回答:


159

enable-cors.orgの例を確認しください。

node.js上のExpressJSアプリで、ルートを使用して以下を実行します。

app.all('/', function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  next();
 });

app.get('/', function(req, res, next) {
  // Handle the get for this route
});

app.post('/', function(req, res, next) {
 // Handle the post for this route
});

最初の呼び出し(app.all)は、アプリ内の他のすべてのルート(または少なくともCORSを有効にするルート)の前に行う必要があります。

[編集]

ヘッダーを静的ファイルにも表示したい場合は、これを試してください(次の呼び出しの前にあることを確認してくださいuse(express.static())

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  next();
});

私はあなたのコードでこれをテストし、publicディレクトリからアセットのヘッダーを取得しました:

var express = require('express')
  , app = express.createServer();

app.configure(function () {
    app.use(express.methodOverride());
    app.use(express.bodyParser());
    app.use(function(req, res, next) {
      res.header("Access-Control-Allow-Origin", "*");
      res.header("Access-Control-Allow-Headers", "X-Requested-With");
      next();
    });
    app.use(app.router);
});

app.configure('development', function () {
    app.use(express.static(__dirname + '/public'));
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

app.configure('production', function () {
    app.use(express.static(__dirname + '/public'));
    app.use(express.errorHandler());
});

app.listen(8888);
console.log('express running at http://localhost:%d', 8888);

もちろん、関数をモジュールにパッケージ化して、次のようなことができます

// cors.js

module.exports = function() {
  return function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "X-Requested-With");
    next();
  };
}

// server.js

cors = require('./cors');
app.use(cors());

ねえ、あなたの応答をありがとう。私はあなたが提案したことをしました(最初の部分ですが、まだリクエストヘッダーに違いはありません)私は上記の私の現在のコードを添付しました。ソリューションの残りの部分をそれにどのように統合できるかを説明できますか?
ガイ

1
私は、あなたがしていることから、驚いているuseINGのapp.router前にexpress.static、それは静的なファイルのヘッダーを変更しないこと。いずれにせよ、私はそれが機能するように私の答えを更新しました。
ミシェルティリー

ありがとう!あなたが正しいと思います。アセットはサーバーから取得され、リクエストされたヘッダーが付いています。私の本当の問題についてはっきりしていなかったかもしれません。getコマンドで外部サーバーにAPI呼び出しを行おうとしています。ここでエラーが発生します。XMLHttpRequestはSOMEURL.comをロードできません。Origin localhost:8888は、Access-Control-Allow-Originでは許可されていません。
ガイ

誤解しているかもしれません。SOMEURL.comでサーバーを制御していますか?
ミシェルティリー

ごめんなさい、今あなたの答えは完全に理解できました。どうもありがとう。私はあなたの助けに感謝します:)
ガイ

58

@Michelle Tilleyの解決策に従うと、最初はうまくいかなかったようです。理由は不明ですが、Chromeと異なるバージョンのノードを使用している可能性があります。いくつかのマイナーな調整を行った後、それは今私のために働いています。

app.all('*', function(req, res, next) {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
  res.header('Access-Control-Allow-Headers', 'Content-Type');
  next();
});

私と同じような問題に直面している人がいる場合、これは役に立つかもしれません。


app.allとapp.getに注目してください。GETではなくOPTIONSリクエストです
Shimon Doodkin

これは私にとってはうまくいきます(私はBackboneを使用してオブジェクトをフェッチしています)。IE 8で動作するかどうかを確認しようとしています...正常に動作しているようです
Adam Loving

今後のユーザー向けの情報:ドメイン名をherokuリポジトリにリダイレクトしているため、この問題が発生していました。とにかく、最初の回答はローカルで機能しましたが、herokuにプッシュした後では機能しませんでした。しかし、この答えはherokuにプッシュした後に機能しました。
クリス・ホレンベック2014年

@KrisHollenbeckこれはherokuでは機能しません。他に何かしましたか?
ベンクレイグ

@BenCraig、いいえ、しかしそれは最初の試みの後に私のために実際には機能しなくなりました。したがって、私はまだこの問題も抱えています。
クリス・ホレンベック2014

11

このcors npmモジュールを試してください。

var cors = require('cors')

var app = express()
app.use(cors())

このモジュールは、ドメインのホワイトリスト化、特定のAPIのCORの有効化など、Cors設定を微調整するための多くの機能を提供します。


2

私はこれを使います:

var app = express();

app
.use(function(req, res, next){
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Headers', 'X-Requested-With');
    next();
})
.options('*', function(req, res, next){
    res.end();
})
;

h.readFiles('controllers').forEach(function(file){
  require('./controllers/' + file)(app);
})
;

app.listen(port);
console.log('server listening on port ' + port);

このコードは、コントローラーがcontrollersディレクトリーにあると想定しています。このディレクトリの各ファイルは次のようになります。

module.exports = function(app){

    app.get('/', function(req, res, next){
        res.end('hi');
    });

}

1

cors expressモジュールの使用をお勧めします。これにより、ドメインをホワイトリストに登録したり、ドメインをルートに限定して許可/制限したりできます。


0

Access-Control-Allow-Credentials: true「Credentials」を介して「cookie」を使用する場合は、を設定する必要があります

app.all('*', function(req, res, next) {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Credentials', true);
  res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
  res.header('Access-Control-Allow-Headers', 'Content-Type');
  next();
});

0
app.use(function(req, res, next) {
var allowedOrigins = [
  "http://localhost:4200"
];
var origin = req.headers.origin;
console.log(origin)
console.log(allowedOrigins.indexOf(origin) > -1)
// Website you wish to allow to
if (allowedOrigins.indexOf(origin) > -1) {
  res.setHeader("Access-Control-Allow-Origin", origin);
}

// res.setHeader("Access-Control-Allow-Origin", "http://localhost:4200");

// Request methods you wish to allow
res.setHeader(
  "Access-Control-Allow-Methods",
  "GET, POST, OPTIONS, PUT, PATCH, DELETE"
);

// Request headers you wish to allow
res.setHeader(
  "Access-Control-Allow-Headers",
  "X-Requested-With,content-type,Authorization"
);

// Set to true if you need the website to include cookies in the requests sent
// to the API (e.g. in case you use sessions)
res.setHeader("Access-Control-Allow-Credentials", true);

// Pass to next layer of middleware
next();

});

このコードをindex.jsまたはserver.jsファイルに追加し、要件に応じて許可される起点配列を変更します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.