首页 > 解决方案 > 预检响应中的 Access-Control-Allow-Headers 不允许节点 Js 请求标头字段 Access-Control-Allow-Origin

问题描述

在节点 API 中添加自定义标头(命名为“RBR”)并在 Flex 环境中作为 Google 端点托管后,出现 CORS 错误。这个节点 API 从 Angular 代码调用。我们将 Angular 和 Node 代码都托管为 Google Flex 环境。API 有 3 个参数,2 个 header 值和 1 个 body 值。1.授权(即 OAuth JWT 令牌) 2. RBR(我们有用于授权的自定义存储库) 3. 正文值 - Json 类型。

在 openapi.yaml 文件中,我们为 CORS 问题添加了以下行。

x-google-endpoints:
    - name: "backend-dot-myproject.appspot.com"
    allowCors: "true"

在节点 js 中,我们为 CORS 问题添加了以下代码。

app.use((req, res, next) => {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers",
    "Access-Control-Allow-Headers,Origin,Accept,X-Requested-With,Content-Type,Access-Control-Request-Method,Access-Control-Request-Headers,authorization,rbr");
  if (req.headers.origin) {
    res.header('Access-Control-Allow-Origin', req.headers.origin);
  }
  if (req.method === 'OPTIONS') {
    res.header("Access-Control-Allow-Methods", "GET, POST, PUT, PATCH, DELETE");
    return res.status(200).json({});
  }
  res.setHeader('Access-Control-Allow-Credentials', true);
  next();
});

标签: node.jsgoogle-cloud-endpoints

解决方案


以下是在 NodeJs+Google Flex 环境中解决这个 CORS 问题的步骤,

  1. 更新中间件代码

      app.use((req, res, next) => {
      res.header("Access-Control-Allow-Origin", "*");
      res.header("Access-Control-Allow-Headers",
        "Origin, X-Requeted-With, Content-Type, Accept, Authorization, RBR");
      if (req.headers.origin) {
        res.header('Access-Control-Allow-Origin', req.headers.origin);
      }
      if (req.method === 'OPTIONS') {
        res.header("Access-Control-Allow-Methods", "GET, POST, PUT, PATCH, DELETE");
        return res.status(200).json({});
      }
      next();
     });  
  2. 在 app.yaml

handlers:
    - url: /
      static_dir: /
      http_headers:
        Access-Control-Allow-Origin: '*'

推荐阅读