为什么即使我有 200 状态 Apollo 客户端也会忽略响应

问题描述

我正在使用 LocalStack 复制 AWS 服务。

我的 Lambda 和 API 网关在 LocalStack 中的运行方式与它们在 AWS 中的运行方式大致相同。我已经使用 Rest API 工具进行了测试以进行验证。但是,当我使用 Apollo Client 在浏览器中运行相同的查询时,LocalStack 版本不再有效。

我为给定的 GraphQL 尝试了 3 种不同的浏览器,当我通过“网络”选项卡进行检查时,只有 Firefox 显示任何数据。 Apollo 总是在位置 1 处出现 JSON 解码错误。请求总是返回 200 状态代码

我们的客户端设置是:

import { ApolloClient,InMemoryCache,createHttpLink } from '@apollo/client';
import 'cross-fetch/polyfill';

const httpLink = createHttpLink({
  uri: 'http://example.com/graphql',credentials: 'include',// Allow other domains too
  fetchOptions: {
    mode:  'no-cors',},});

export const client = new ApolloClient({
  link: httpLink,cache: new InMemoryCache(),});

Apollo 中是否可能存在一些 CORS 问题?我很确定我在网关、access-control-allow-origin: http://localhost:3000Content-Type: application/json 等中正确设置了标头。

有没有人看到过类似的错误

更新

我发现从 no-cors 切换到 cors 允许它使用已知的良好 URL 工作。
好像是:

  • 设置 cors 时,会进行预检。此 OPTIONS 请求提供了许多响应标头,其中的 Access-Control-Allow-Origin 必须设置为请求域。
  • 当设置 no-cors 时,没有预检,无论出于何种原因,响应都会被拒绝,即使它也包含正确的 Access-Control-Allow-Origin我使用与 cors 选项配合使用的网址进行了测试

总结

  1. 此时,LocalStack 无法提供正确的 OPTIONS 响应,请参阅 https://github.com/localstack/localstack/issues/4204,这使我无法使用 cors
  2. 使用 no-cors 失败,即使我使用已知的良好网址也是如此。

我已经放弃了 LocalStack,转而直接从 AWS 使用 API Gateway。

我希望这会有所帮助。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)