我正在处理一个在MEAN堆栈上运行的小应用程序,并遇到了一个令人讨厌的障碍:我的后端应用程序(节点Express)运行在http://localhost:3000
,运行良好,但我的前端客户端应用程序(的Javascript AngularJS)运行在http://localhost:8000
,这意味着从角发送的请求被接受,并回答了,但一旦他们到达因为他们解释为来自不同来源来被拒绝。在Express中设置默认响应标头
我能以相对较少的戏剧解决这个问题,通过使我的“告诉我所有的东西”的方法是这个样子:
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
条目。
在一个完美的世界,我可以根据正在执行什么样的环境中的代码和关闭翻盖,但我在app.js会完全满足于一个代码块,我至少可以删除一次而不是试图追踪res.setHeader
的75个实例。我想一定有改变落后res
的.json
方法隐藏在它的基础的方式,但该文档不提供任何洞察我怎么可能做到这一点,更何况它是否是一个可怕的想法。有什么想法吗?
编辑
我认为(作为建议)是configuring application-level middleware是关键。下面是我添加到我的app.js文件的代码:
// allow CORS:
app.use(function (req, res, next) {
res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8000');
next();
});
然而,这产生了同样的错误(“没有‘访问控制允许来源’标头出现在所请求的资源”)像之前一样。
这就是'app.use()'用于安装一个中间件处理程序,它可以查看/修改所有请求。 – jfriend00
我有一种感觉,我很接近,但我注册的中间件似乎没有做任何事情(请参阅编辑我的问题);我添加了一些调试输出以查看它何时执行,但它从未在控制台中弹出。我对[内置中间件中的“setHeaders”选项](http://expressjs.com/guide/using-middleware.html#middleware.built-in)感到乐观,但它仅适用于静态资源,而我找不到相应的第三方处理......其他所有内容。 –
看起来你可能还得设置'Access-Control-Allow-Headers'。请参阅http://jonathanmh.com/how-to-enable-cors-in-express-js-node-js/ – jfriend00