在Express中设置默认的响应标题
我正在一个运行在MEAN堆栈上的小应用程序,并且遇到了一个烦人的障碍:我的后端应用程序(Node with Express )在http://localhost:3000
,工作正常,但是我的前端客户端应用程序Javascript与AngularJS)运行在http://localhost:8000
,这意味着从Angular发送的请求将被接收并作出响应,但一旦到达,就会被拒绝,因为它们被解释为来自不同的来源。
我能够用相对较less的戏剧来解决这个问题,通过使我的“展示我所有的东西”的方法看起来像这样:
exports.index = function(req, res) { Region.find({}, function(err, docs) { if(!err) { res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8000'); res.json(200, { regions: docs }); } else { res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8000'); res.json(500, { message: err }); } }); }
res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8000');
行是我添加的告诉浏览器可以接受的反应,并停止打扰我; 现在的问题是,我必须将这个愚蠢的行添加到从任何地方发送的每一个响应中,并且我确信我必须错过某种方法来更改默认标题以永远包括Access-Control-Allow-Origin
条目。
在一个完美的世界里,我可以根据代码被执行的环境来打开和closures,但是我完全可以在app.js中定义一个代码块,我至less可以删除一个代码块试图追踪res.setHeader
75个实例。 我认为必须有一种方法来改变隐藏在其基础之后的.json
方法,但是文档并没有提供任何有关如何做到这一点的信息,更不用说它是否是一个可怕的想法。 有什么想法吗?
编辑
我认为(如所build议的那样) configuration应用程序级中间件是关键。 以下是我添加到我的app.js文件中的代码:
// allow CORS: app.use(function (req, res, next) { res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8000'); next(); });
然而,这也产生了与之前相同的错误(“No”Access-Control-Allow-Origin“头部存在于被请求的资源上”)。
你可以使用.use()来制作一个普通的中间件,或者像express-interceptor一样使用npm包来拦截响应
试试这个作为中间件:
app.use(function(req, res, next) { res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Methods', 'GET, POST'); res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type, Authorization'); next(); });
我刚刚遇到同样的问题,并尝试上面的相同的片段。 它做了诡计。
// allow CORS: app.use(function (req, res, next) { res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8000'); next(); });
我只是要确保把它放在所有其他的app.use(xyz)条目之上,就像@rev_bird提到他对cors模块所做的那样。 尝试一下。