将 Apollo 反应到不同端口上的 graphql-php 服务器

Posted

技术标签:

【中文标题】将 Apollo 反应到不同端口上的 graphql-php 服务器【英文标题】:React Apollo to graphql-php server on different ports 【发布时间】:2018-04-27 11:59:58 【问题描述】:

我正在尝试使用 Apollo 将我的 create-react-app 前端连接到我的 graphql-php 服务器。由于两者都在我的本地机器上的不同端口(分别为 3000 和 8080)上运行,我遇到了一些 CORS 问题。 Apollo 正在发送一个 OPTIONS 请求,然后抛出一个控制台日志消息:

 DOMException: Failed to execute 'postMessage' on 'Window': Error: Network request failed with status 200 - "OK" could not be cloned.
        at ApolloClient.hookLogger [as devToolsHookCb] (<anonymous>:14:14)
        at QueryManager.onBroadcast (http://localhost:3000/static/js/bundle.js:2585:27)
        at QueryManager../node_modules/apollo-client/core/QueryManager.js.QueryManager.broadcastQueries (http://localhost:3000/static/js/bundle.js:3659:14)
        at http://localhost:3000/static/js/bundle.js:3230:31
        at <anonymous>

希望任何人都可以提供有关如何让这两个人互相交谈的任何帮助!

前端 Apollo 配置:

const httpLink = new HttpLink(uri:'http://localhost:8080/temps_api/index.php'); //TODO: Separate into config file
const client = new ApolloClient(
    link: httpLink,
    cache: new InMemoryCache()
);

index.php

<?php
require_once 'vendor\autoload.php';
require_once 'core\bootstrap.php';

header('Access-Control-Allow-Origin: *');

use GraphQL\GraphQL;
use GraphQL\Type\Schema;
use Temps\Types\Types;

$schema = new Schema([
    'query' => Types::query()
]);

// $data = Data::parseInput();

var_dump(file_get_contents('php://input'));

//Test query
// $data = [
//   'query' => '
//     
//         user(email: "jane@email.com", password: "password") 
//             __typename,
//             username,
//             userType,
//             email
//         
//     '
// ];
//This method will vlidate the POST variables and turn them into $data array

$result = GraphQL::executeQuery(
    $schema,
    $data['query']
);

echo json_encode($result);

【问题讨论】:

【参考方案1】:

您必须在回显结果之前设置一些标题。像这样

header('Content-Type: application/json', true, $httpStatus);
    if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') 
    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']) && $_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'] == 'POST') 
        header('Access-Control-Allow-Origin: *');
        header('Access-Control-Allow-Headers: X-Requested-With, content-type, access-control-allow-origin, access-control-allow-methods, access-control-allow-headers');
    


header('Access-Control-Allow-Origin: *');
echo json_encode($result);
exit;

【讨论】:

以上是关于将 Apollo 反应到不同端口上的 graphql-php 服务器的主要内容,如果未能解决你的问题,请参考以下文章

Apollo GraphQL:用于查询返回不同类型对象的模式?

反应应用程序上的 Apollo 客户端缓存问题

如何将数据从反应组件传递到 Apollo graphql 查询?

Tomcat apache 8 服务器(端口 - 8080)上的 Pentaho API 在通过不同的 Web 应用程序调用时会出现 COR 问题(反应 JS,端口 - 3000)

无法使用 graphq-request 表示嵌套对象输入类型的数组

Apollo 客户端不显示错误消息