如何允许CORS?

我正在尝试在使用Express.js Web框架的Node.js应用程序中支持CORS。 我已经阅读了关于如何处理这个问题的Google小组讨论 ,并阅读了一些关于CORS如何工作的文章。 首先,我这样做了(代码是用CoffeeScript语法编写的):

app.options "*", (req, res) -> res.header 'Access-Control-Allow-Origin', '*' res.header 'Access-Control-Allow-Credentials', true # try: 'POST, GET, PUT, DELETE, OPTIONS' res.header 'Access-Control-Allow-Methods', 'GET, OPTIONS' # try: 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept' res.header 'Access-Control-Allow-Headers', 'Content-Type' # ... 

这似乎并不奏效。 好像我的浏览器(Chrome)没有发送初始的OPTIONS请求。 当我刚刚更新资源块时,我需要提交一个跨源GET请求到:

 app.get "/somethingelse", (req, res) -> # ... res.header 'Access-Control-Allow-Origin', '*' res.header 'Access-Control-Allow-Credentials', true res.header 'Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS' res.header 'Access-Control-Allow-Headers', 'Content-Type' # ... 

它工作(在Chrome中)。 这也适用于Safari。

我已经读了…

在实现CORS的浏览器中,每个交叉源GET或POST请求之前都有一个OPTIONS请求,用于检查GET或POST是否正确。

所以我的主要问题是,怎么这似乎没有发生在我的情况? 为什么不是我的app.options块被调用? 为什么我需要在我的主app.get块中设置标题?

要回答你的主要问题,CORS规范只需要OPTIONS调用在POST或GET之前,如果POST或GET有任何非简单的内容或标题。

请参阅https://developer.mozilla.org/En/HTTP_access_control中的; “预检请求”

我发现最简单的方法是使用node.js包cors 。 最简单的用法是:

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

当然有很多方法可以根据您的需要configuration行为。 上面链接的页面显示了一些例子。

尝试将控制权交给下一个匹配路线。 如果Express首先匹配app.get路由,那么除非你这样做,否则它不会继续到选项路由(注意使用next)

 app.get('somethingelse', function(req, res, next) { //..set headers etc. next(); }); 

在组织CORS方面,我把它放在一个对我来说工作得很好的中间件中:

 //CORS middleware var allowCrossDomain = function(req, res, next) { res.header('Access-Control-Allow-Origin', 'example.com'); res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); res.header('Access-Control-Allow-Headers', 'Content-Type'); next(); } //... app.configure(function() { app.use(express.bodyParser()); app.use(express.cookieParser()); app.use(express.session({ secret: 'cool beans' })); app.use(express.methodOverride()); app.use(allowCrossDomain); app.use(app.router); app.use(express.static(__dirname + '/public')); }); 

留在路由相同的想法。 我使用这个代码:

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

类似于http://enable-cors.org/server_expressjs.html示例;

我做了一个更完整的中间件适合快递或连接。 它支持用于预检检查的OPTIONS请求。 请注意,它将允许CORS访问任何内容,如果您想限制访问权限,则可能需要进行一些检查。

 app.use(function(req, res, next) { var oneof = false; if(req.headers.origin) { res.header('Access-Control-Allow-Origin', req.headers.origin); oneof = true; } if(req.headers['access-control-request-method']) { res.header('Access-Control-Allow-Methods', req.headers['access-control-request-method']); oneof = true; } if(req.headers['access-control-request-headers']) { res.header('Access-Control-Allow-Headers', req.headers['access-control-request-headers']); oneof = true; } if(oneof) { res.header('Access-Control-Max-Age', 60 * 60 * 24 * 365); } // intercept OPTIONS method if (oneof && req.method == 'OPTIONS') { res.send(200); } else { next(); } }); 

 npm install cors --save 

只要在你的请求所在的主文件中添加这些行即可。

 const cors = require('cors'); const express = require('express'); let app = express(); app.use(cors()); app.options('*', cors()); 

安装expressjs的cors模块。 你可以按照这些步骤>

安装

 npm install cors 

简单使用(启用所有CORS请求)

 var express = require('express'); var cors = require('cors'); var app = express(); app.use(cors()); 

有关更多详细信息,请访问https://github.com/expressjs/cors

做这样的事情:

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

使用express + node +离子在不同端口运行testing。

Localhost:8100

Localhost:5000

 // CORS (Cross-Origin Resource Sharing) headers to support Cross-site HTTP requests app.all('*', function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "X-Requested-With"); res.header('Access-Control-Allow-Headers', 'Content-Type'); next(); }); 

这适用于我,作为一个简单的路线内实现,即时通讯使用meanjs和它的工作正常,Safari浏览器,铬等

 app.route('/footer-contact-form').post(emailer.sendFooterMail).options(function(req,res,next){ res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Methods', 'GET, POST'); res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept'); return res.send(200); }); 

首先只需在您的项目中安装Cors。 以terminal(命令提示符)并cd到您的项目目录并运行以下命令:

 npm install cors --save 

然后采取server.js文件并更改代码添加以下内容:

 var cors = require('cors'); var app = express(); app.use(cors()); app.use(function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header('Access-Control-Allow-Methods', 'DELETE, PUT, GET, POST'); res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); next(); }); 

这对我有用..

我最简单的解决scheme与Express 4.2.0(编辑:似乎不工作在4.3.0)是:

 function supportCrossOriginScript(req, res, next) { res.status(200); res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "Content-Type"); // res.header("Access-Control-Allow-Headers", "Origin"); // res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); // res.header("Access-Control-Allow-Methods","POST, OPTIONS"); // res.header("Access-Control-Allow-Methods","POST, GET, OPTIONS, DELETE, PUT, HEAD"); // res.header("Access-Control-Max-Age","1728000"); next(); } // Support CORS app.options('/result', supportCrossOriginScript); app.post('/result', supportCrossOriginScript, function(req, res) { res.send('received'); // do stuff with req }); 

app.all('/result', ...)也可以。

我发现使用npm请求包( https://www.npmjs.com/package/request )很容易做到这一点。

然后我根据这个posthttp://blog.javascripting.com/2015/01/17/dont-hassle-with-cors/

 'use strict' const express = require('express'); const request = require('request'); let proxyConfig = { url : { base: 'http://servertoreach.com?id=', } } /* setting up and configuring node express server for the application */ let server = express(); server.set('port', 3000); /* methods forwarded to the servertoreach proxy */ server.use('/somethingElse', function(req, res) { let url = proxyConfig.url.base + req.query.id; req.pipe(request(url)).pipe(res); }); /* start the server */ server.listen(server.get('port'), function() { console.log('express server with a proxy listening on port ' + server.get('port')); }); 

除了别人所说的之外,不要忘记,除非使用nodemon,否则需要重新启动节点服务器才能使更改生效!

我个人一直习惯于刷新浏览器,忘记它是服务器端代码。

我们可以避免CORS并将请求转发给其他服务器:

 // config: var public_folder = __dirname + '/public' var apiServerHost = 'http://other.server' // code: console.log("starting server..."); var express = require('express'); var app = express(); var request = require('request'); // serve static files app.use(express.static(public_folder)); // if not found, serve from another server app.use(function(req, res) { var url = apiServerHost + req.url; req.pipe(request(url)).pipe(res); }); app.listen(80, function(){ console.log("server ready"); }); 

前一段时间,我遇到了这个问题,所以我做了这个,让我的nodejs应用程序中的CORS:

 var express = require('express'); var app = express(); var cors = require('cors'); var bodyParser = require('body-parser'); //enable cors app.use(cors({ 'allowedHeaders': ['sessionId', 'Content-Type'], 'exposedHeaders': ['sessionId'], 'origin': '*', 'methods': 'GET,HEAD,PUT,PATCH,POST,DELETE', 'preflightContinue': false 

}));

 require('./router/index')(app);