apollo-client不能与CORS一起使用

tmp*_*dev 9 lambda cors apollo-client

我正在AWS Lambda上编写graphql服务器组件(不使用graphql-server).在客户端,我正在使用apollo-client.关于我正在设置的lambda函数的响应

const response = {
    statusCode: 200,
    headers: {
        "Access-Control-Allow-Origin": "*" // Required for CORS support to work
    },
    body: JSON.stringify({
        result: 'mock data',
        input: event,
    }),
};
callback(null, response);
Run Code Online (Sandbox Code Playgroud)

在客户端使用ApolloClient我收到以下错误

对预检请求的响应未通过访问控制检查:请求的资源上不存在"Access-Control-Allow-Origin"标头.因此,不允许来源" http:// localhost:8080 "访问.

但是,当我使用像axios这样的东西执行相同的请求时,它工作正常.此外,当我刚刚对postman这样的请求执行请求时,我看到响应上启用了"Access-Control-Allow-Origin"设置.这是apollo-client的已知问题,我该如何解决这个问题?

iva*_*ro0 15

要解决与Apollo的CORS问题,您必须将no-cors选项传递给底层fetch.

import ApolloClient from "apollo-boost";

const client = new ApolloClient({
  uri: "your client uri goes here",
  fetchOptions: {
    mode: 'no-cors',
  },
});
Run Code Online (Sandbox Code Playgroud)

这不是一个特定的Apollo问题,而是一个旨在解决的fetch配置,请参阅此信息以获取更多信息:https://developers.google.com/web/ilt/pwa/working-with-the-fetch -API#跨origin_requests

我想知道为什么它适用于Axios,我希望你能将no-cors模式设置在某个地方.

  • apollo 3.0 中没有此选项 (13认同)
  • 我使用了 mode: no-cors ,它会默默地停止我的 http 标头。值得一提的是,作为使用 no-cors 的副作用 (4认同)
  • 对于 Apollo 3.x,您将 `fetchOptions` 放在 `ApolloLink` 选项中 (4认同)
  • 如果我添加 `mode:'no-cors'` 我收到服务器端错误,响应代码为 500 我不知道如何解决它 (2认同)

Mah*_*ayi 9

Ivan 的答案对于 Apollo 客户端 2.xx 是正确的

对于 Apollo 客户端 >= 3.0.0 您可以使用:

import { ApolloClient, HttpLink } from '@apollo/client';

const client = new ApolloClient({
  link: new HttpLink({
      uri: 'your client uri goes here',
      fetchOptions: {
        mode: 'no-cors'
      }
  }),
});
Run Code Online (Sandbox Code Playgroud)


ore*_*uwa 3

我假设您使用的是 AWS API 网关。

您的一个问题是:您是否为网关启用了 CORS? 怎么看

我相信这应该可以解决您的问题,如果您还发送cookie,您也可以设置"Access-Control-Allow-Credentials" : true标头。`

  • 我也在 API 网关中启用了 CORS。另外,当我从同一客户端应用程序向同一端点执行简单的 Axios 命令时,它工作得很好。只是当我尝试通过 apollo-client 时它失败了。 (3认同)