0

我使用 Express Gateway 作为我的 API 网关来连接后端服务器。我的前端在 localhost:3000 上运行,Express 网关在 localhost:8080 上运行。当我尝试从前端访问后端时,我的浏览器中出现了 cors 错误。然而,当使用邮递员时,一切都很好。

我的 gateway.config.yml (只有一个管道)

user:
    apiEndpoints:
      - user
    policies:
      - cors:
        - action:
            origin: "*"
            credentials: true
            methods: ['GET','POST','PUT','DELETE']
            allowedHeaders: ['Content-type','Authorization','Origin','Access-Control-Allow-Origin','Origin', 'Accept', 'X-Requested-With', 'Content-Type', 'Access-Control-Request-Method', 'Access-Control-Request-Headers','Authorization', 'Access-Control-Allow-Origin','X-TEST']
            exposedHeaders : ['Content-type','Authorization','Origin','Access-Control-Allow-Origin','Origin', 'Accept', 'X-Requested-With', 'Content-Type', 'Access-Control-Request-Method', 'Access-Control-Request-Headers','Authorization', 'Access-Control-Allow-Origin','X-TEST']
            preflightContinue: true
      - jwt:
        - action:
            secretOrPublicKey: 'secret'
            checkCredentialExistence: false
      - request-transformer:
        - action:
            body:
              add:
                user: req.user
      - proxy:
        - action:
            serviceEndpoint: noAuthService

我收到以下错误。

Access to XMLHttpRequest at 'http://localhost:8080/api/user/31a19f8a-c76d-4051-a944-dad1b676c550' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

知道如何解决这个问题吗???

4

1 回答 1

-1

错误消息表明请求中存在自定义标头触发了飞行前请求以检查 CORS 访问权限,但您的服务器未正确响应该飞行前请求,因此未授予访问权限。

它适用于邮递员,因为邮递员不强制执行 CORS。浏览器确实强制执行 CORS。

我的第一个问题是你为什么不把网关代码合并到前端服务器中呢?为什么需要两台独立的服务器?

然后,要处理飞行前请求,您需要处理 OPTIONS 请求(而不是 GET 或 POST,传入的 http 动词是 OPTIONS),如图所示您可以在此处阅读有关预发送请求的信息,并查看一些有关如何处理它们的示例。在 Express 中,您将使用

如果您正在使用该软件包,您可以在此处此处cors()查看一些飞行前处理示例。

于 2020-04-29T17:06:59.987 回答