Сообщение: не удалось разрешить обещание в GraphQL API с DataLoader - PullRequest
2 голосов
/ 03 апреля 2020

Я создал API-интерфейс basi c с использованием графики с PHP и mysql. когда у меня есть пожарный запрос с использованием почтальона. я новый пользователь grapql

{"query": "query {getPeople {name, pet {isDog, sound}}}"}, затем появляется ошибка

enter image description here

но этот запрос работает нормально {"query": "query {getPeople {name}}"} enter image description here Кто-нибудь объяснит, в чем проблема? файл схемы

  type Query {
      getPeople: [Person]
    }

    type Person {
      name: String
      pet: Pet
    }

    type Pet {
      isDog: Boolean
      sound: String
    }

мой код конечной точки

require_once FCPATH . 'vendor/autoload.php';
use GraphQL\Type\Definition\ObjectType;
use Siler\Graphql;
use GraphQL\GraphQL as WGraphql;
use Siler\Http\Request;
use Siler\Http\Response;
use Overblog\DataLoader\DataLoader;
use Overblog\DataLoader\Promise\Adapter\Webonyx\GraphQL\SyncPromiseAdapter;
use Overblog\PromiseAdapter\Adapter\WebonyxGraphQLSyncPromiseAdapter;
use GraphQL\Utils\BuildSchema;

Response\header('Access-Control-Allow-Origin', '*');
        Response\header('Access-Control-Allow-Headers', 'content-type');

        $MyDB = new mysqli("localhost", "root", "Oneclick1@", "test");

        if ($MyDB->connect_errno) {
            error_log("Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error);
        }

        function sql($query) {
            $MyDB = new mysqli("localhost", "root", "Oneclick1@", "test");
            //echo $query;
            //print_r([$MyDB, $query]);exit;
            $result = mysqli_query($MyDB, $query);
            $rows = mysqli_fetch_all($result, MYSQLI_ASSOC);  

            return $rows;
        }

        $graphQLSyncPromiseAdapter = new SyncPromiseAdapter();
        $promiseAdapter = new WebonyxGraphQLSyncPromiseAdapter($graphQLSyncPromiseAdapter);

        $petLoader = new DataLoader(function ($keys) use ($promiseAdapter ) {

            $ids = join(',', $keys);
            $idMap = array_flip($keys);
            $rows = sql("SELECT owner, isDog, sound FROM pets WHERE owner in ({$ids});");
            // echo "<pre>";
            // print_r($rows);
            // exit;
            foreach ($rows as $r) {
                $idMap[$r['owner']] = $r;
            }
            //print_r($promiseAdapter->createAll(array_values($idMap)));exit;
            return $promiseAdapter->createAll(array_values($idMap));
        }, $promiseAdapter);
         //print_r($promiseAdapter);exit;
        WGraphQL::setPromiseAdapter($graphQLSyncPromiseAdapter);

        $context = [
            'petLoader' => $petLoader,
            'sql' => function ($query) {
                return sql($query);
            }
        ];

        if (Request\method_is('post')) {

            $schema = include  FCPATH . '/php-graphql-example-master/schema.php';;

            Graphql\init($schema, null, $context);
        }

resolver. php

use Overblog \ DataLoader \ DataLoader;

return [
    'Person' => [
        'pet' =>  function($root, $args, $context) {
           // print_r($context);exit;
            // echo "33";
            // print_r($root['id']);exit;
            return $context['petLoader']->load($root['id']);
        },
    ],
    'Query' => [
        'getPeople' => function($root, $args, $context) {
            return $context['sql']("SELECT name, id FROM people");
        }
    ]
];

схема. php

use Siler\Graphql;

$typeDefs = file_get_contents(__DIR__.'/schema.graphql');
$resolvers = include __DIR__.'/resolvers.php';

return Graphql\schema($typeDefs, $resolvers);
...