Как включить совместное использование ресурсов между источниками (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);
7 ответов
Посмотрите пример с 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());
После решения @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();
});
В случае, если кто-то сталкивается с проблемой, аналогичной моей, это может быть полезно.
Попробуйте это cors npm модуля.
var cors = require('cors')
var app = express()
app.use(cors())
Этот модуль предоставляет множество функций для точной настройки параметров Cors, таких как белый список доменов, включение Cors для конкретных API и т. Д.
Я использую это:
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');
});
}
Рекомендую использовать модуль Cors Express. Это позволяет вам занести в белый список домены, разрешить / ограничить домены специально для маршрутов и т. Д.,
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 и измените разрешенный исходный массив в соответствии с вашими требованиями.
Вы должны установить 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();
});
Еще одним шагом, который мне нужно было сделать, было переключение моего URL с http://localhost
в http://127.0.0.0