在 Express 中设置默认响应 headers

Setting default response headers in Express

我正在 MEAN 堆栈上开发一个小应用程序 运行,遇到了一个恼人的问题:我的后端应用程序(带有 Express 的节点)在 运行 http://localhost:3000 并且工作正常,但是我的前端客户端应用程序(Javascript 和 AngularJS)是 运行 在 http://localhost:8000,这意味着从 [=44= 发送请求] 收到并回复,但一旦到达就被拒绝,因为它们被解释为来自不同的来源。

通过使我的 'show me all the stuff' 方法看起来像这样,我能够用相对较少的戏剧性来解决这个问题:

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'); 行是我添加的行,它告诉浏览器可以接受响应并停止打扰我;现在的问题是我必须将这个愚蠢的行添加到从任何地方发送的每个响应中,而且我确信我必须缺少一些方法来更改默认值 headers 以包含 Access-Control-Allow-Origin永远进入。

在一个完美的世界中,我可以根据代码执行的环境打开和关闭它,但我完全满足于 app.js 中的代码块,我至少可以删除一次而不是试图追踪 75 个 res.setHeader 实例。我认为必须有一种方法可以更改隐藏在 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();
});

然而,这产生了与以前相同的错误 ("No 'Access-Control-Allow-Origin' header is present on the requested resource.")。

您可以使用 .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 模块。试试吧。