104

パブリック ディレクトリから静的ファイルを提供しながら、クロスドメイン スクリプティングをサポートする 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);
4

8 に答える 8

161

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());
于 2012-06-25T00:01:06.773 に答える
61

@Michelle Tilley ソリューションに従って、最初はうまくいかなかったようです。理由はわかりませんが、クロムと異なるバージョンのノードを使用している可能性があります。いくつかの微調整を行った後、現在は機能しています。

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();
});

誰かが私のような問題に直面している場合、これは役立つかもしれません.

于 2012-07-23T07:10:08.757 に答える
-9

http://localhostもう 1 つ必要な手順は、URL を からに切り替えることでした。http://127.0.0.0

于 2014-07-01T20:54:35.947 に答える