如何允许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(); });
我做了一个更完整的中间件适合快递或连接。 它支持用于预检检查的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);