Javascript 在Express中设置默认响应头

Javascript 在Express中设置默认响应头,javascript,node.js,express,cors,mean-stack,Javascript,Node.js,Express,Cors,Mean Stack,我正在开发一个在平均堆栈上运行的小应用程序,遇到了一个恼人的障碍:我的后端应用程序(Node with)运行在http://localhost:3000工作正常,但我的前端客户端应用程序(带有AngularJS的Javascript)正在运行http://localhost:8000,这意味着从Angular发送的请求会被接收和响应,但一旦它们到达就会被拒绝,因为它们被解释为来自不同的来源 我能够用相对较少的戏剧性来解决这个问题,通过使我的“向我展示所有东西”方法看起来像这样: exports.

我正在开发一个在平均堆栈上运行的小应用程序,遇到了一个恼人的障碍:我的后端应用程序(Node with)运行在
http://localhost:3000
工作正常,但我的前端客户端应用程序(带有AngularJS的Javascript)正在运行
http://localhost:8000
,这意味着从Angular发送的请求会被接收和响应,但一旦它们到达就会被拒绝,因为它们被解释为来自不同的来源

我能够用相对较少的戏剧性来解决这个问题,通过使我的“向我展示所有东西”方法看起来像这样:

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中使用至少可以删除一次的代码块,而不是试图跟踪75个
res.setHeader
实例。我想一定有办法改变隐藏在
res
后面的
.json
方法,但文档没有提供我如何做到这一点的任何见解,更不用说这是否是一个糟糕的想法了。有什么想法吗

编辑

我认为(正如建议的那样)这是关键。下面是我添加到app.js文件中的代码:

// allow CORS:
app.use(function (req, res, next) {
  res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8000');
  next();
});

但是,这产生了与以前相同的错误(“请求的资源上不存在“Access Control Allow Origin”头)。

您可以使用.use()创建一个通用中间件,或者也可以使用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();
});

我只需要确保将它放在所有其他应用程序之上。使用(xyz)条目,就像@rev_bird提到的他对cors模块所做的那样。试试看。

这就是
app.use()
安装中间件处理程序的目的,该处理程序可以查看/修改所有请求。我有一种感觉,我已经很接近了,但我注册的中间件似乎什么都没有做(请参阅对我问题的编辑);我添加了一些调试输出以查看它何时被执行,但它从未在控制台中弹出。我对它很乐观,但它只针对静态资源,我找不到相应的第三方来处理。。。其他所有内容。看起来您可能还必须设置
访问控制允许标题
。看,试试npm模块,它很漂亮solid@jfriend00:如果我使用原始的重复设置标题的方式,它可以使用或不使用
访问控制允许标题
@jusynth:“cors”打包成功了!起初,它和我尝试过的其他六个包一样失败,但是移动
app.use(cors())
应用程序列表的底部。使用(foo)
列表顶部的条目修复所有问题。不知道为什么。非常感谢。唉,我不想取消这个标记作为答案,但我意识到,一旦我批准了这个,我就忘了重新启动服务器。我在上面添加了我的代码片段,以便您可以看到添加的内容,但它实际上不起作用。这对生产用例安全吗?您可以使用确切的IP来实现
访问控制允许源
标题更安全,并且可以在
访问控制允许标题
中删除
X-request-With
。否则,就可以了