无法在 React 中使用 GraphQL 查询 - 已被 CORS 策略阻止:请求的资源上不存在“Access-Control-Allow-Origin”标头

Posted

技术标签:

【中文标题】无法在 React 中使用 GraphQL 查询 - 已被 CORS 策略阻止:请求的资源上不存在“Access-Control-Allow-Origin”标头【英文标题】:Cannot use GraphQL queries in React - has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource 【发布时间】:2018-02-14 02:10:43 【问题描述】:

我有一个 React 应用程序,它连接到一个后端 Laravel 应用程序,该应用程序顶部有一个 GraphQL 层。

我有一个这样的 GraphQL 查询:

http://laravel-quarx.dev/graphql?query=query+getUserNameAndIdusersid,name

这将返回以下 JSON:

"data":"users":["id":1,"name":"Admin","id":2,"name":"Saqueib Ansrai"]

这是我在 React 中获取这些数据的方式(我使用的是 Redux,所以我在 Saga 中调用):

function* fetchProducts(actions) 
    try 
        const response = yield call(fetchApi, 
            method: 'GET',
            url: '?query=query+getUserNameAndIdusersid,name',
        );

        yield put(productSuccess(response));
     catch (e) 
        yield put(productFailure(e.response ? e.response.data.message : e));
    

这会导致以下错误:

XMLHttpRequest 无法加载 http://laravel-quarx.dev/graphql/?query=query+getUserNameAndIdusersid,name。 重定向自 'http://laravel-quarx.dev/graphql/?query=query+getUserNameAndIdusersid,name' 到 'http://laravel-quarx.dev/graphql?query=query+getUserNameAndIdusersid,name' 已被 CORS 策略阻止:没有“访问控制允许来源” 请求的资源上存在标头。起源 'http://localhost:3000' 因此不允许访问。

我不确定我必须在服务器端应用程序上做什么才能绕过 CORS 限制,有什么想法吗?

编辑:

标题:

Cors 配置:

return [
    /*
    |--------------------------------------------------------------------------
    | Laravel CORS
    |--------------------------------------------------------------------------
    |
    | allowedOrigins, allowedHeaders and allowedMethods can be set to array('*')
    | to accept any value.
    |
    */
    'supportsCredentials' => false,
    'allowedOrigins' => ['*'],
    //Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Cache-Control
    'allowedHeaders' => ['*'],
    'allowedMethods' => ['*'], // ex: ['GET', 'POST', 'PUT',  'DELETE']
    'exposedHeaders' => [],
    'maxAge' => 0,
];

【问题讨论】:

试试这个https://github.com/barryvdh/laravel-cors @Panther 我尝试了那个确切的包,但仍然遇到同样的问题。 您是否设置了config/cors.php,如他们的 github 自述页面所示,您是否发布了相同的内容?如果是这样,您可以显示选项请求的response 标头吗? @Panther 是的,我做的完全一样,请参阅标题的编辑。 看起来不存在 CORS 标头。 allowedOriginsallowedHeadersallowedMethods 之类的标头应该出现在 options 请求的 response 中。因此,您的配置或服务器中缺少某些内容,您必须找出这些内容。 【参考方案1】:

你有两个选择,一个是让你的应用程序理解 cors,第二个是在你的 apollo 客户端的 fetch 选项中禁用 cors:

const link  = new HttpLink(
        uri: 'URI',
        fetchOptions: 
            mode: 'no-cors'
        
    );

【讨论】:

以上是关于无法在 React 中使用 GraphQL 查询 - 已被 CORS 策略阻止:请求的资源上不存在“Access-Control-Allow-Origin”标头的主要内容,如果未能解决你的问题,请参考以下文章

在 apollo (graphql) 查询中无法识别 FlowRouter

尝试使用 React Apollo Query 组件进行 GraphQL 查询,打字稿导致错误

无法在 Apollo GraphQL 的查询中使用 @client @export 变量

在 React 中使用 GraphQL 查询数据以及来自先前查询的数据

使用 graphql 在 react-native 中重新获取查询

无法将 GraphQL 查询从 Apollo 客户端发送到 Rails GraphQL 后端