在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模块所做的那样。 尝试一下。