Как включить совместное использование ресурсов между источниками (CORS) в express.JS framework на узле.js
Я пытаюсь построить веб-сервер в узел.js, который будет поддерживать междоменные сценарии, при этом предоставляя статические файлы из общего каталога. Я использую экспресс.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 на узле.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 включен).[Edit]
если вы хотите, чтобы заголовки отображались и для статических файлов, попробуйте это (убедитесь, что это перед вызовом
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(); });Я проверил это с вашим кодом, и получил заголовки на активы из :
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());
после решения @Brandon 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 модуль экспресс. Это позволяет вам включать домены в белый список, разрешать/ограничивать Домены специально для маршрутов и т. д.,
необходимо указать
Access-Control-Allow-Credentials: true, Если вы хотите использовать "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(); });
еще один шаг, который мне нужно было сделать, это переключить мой URL с
http://localhostдоhttp://127.0.0.0
Comments