Как включить совместное использование ресурсов скремничество (CORS) в фреймворке express.js на node.js

Я пытаюсь создать веб-сервер в node.js, который будет поддерживать междоменные скрипты, сохраняя при этом статические файлы из общего каталога. Я использую 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);

Ответ 1

Просмотрите пример из enable-cors.org:

В приложении ExpressJS на node.js выполните следующие маршруты:

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

Ответ 2

После решения @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();
});

В случае, если кто-то сталкивается с проблемой, аналогичной моей, это может быть полезно.

Ответ 3

Попробуйте cors npm modules.

var cors = require('cors')

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

Этот модуль предоставляет множество функций для точной настройки настроек cors, таких как "белый список" домена, включение cors для конкретного apis и т.д.

Ответ 4

Я использую это:

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

этот код предполагает, что ваши контроллеры расположены в каталоге контроллеров. каждый файл в этом каталоге должен выглядеть примерно так:

module.exports = function(app){

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

}

Ответ 5

Рекомендовать с помощью модуля cors express. Это позволяет вам переименовывать домены, разрешать/ограничивать домены специально для маршрутов и т.д.,

Ответ 6

Вы должны установить Access-Control-Allow-Credentials: true, если вы хотите использовать "cookie" через "Credentials"

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

Ответ 7

Еще один шаг, который мне нужно было сделать, это переключить мой URL с http://localhost на http://127.0.0.0