Пакетный режим Graphene отвечает статусом 400. Пакетные запросы должны получить список на запрос React-Apollo

Запросы GraphQL от клиента React-Apollo (подробно описаны ниже) к серверу Graphene-Django GraphQL завершаются ошибкой как Status Code 400 Bad Request с сообщением об ошибке:

Batch requests should receive a list, but received {...

Это почему?

Настройка

Получил сервер GraphQL (используя graphene-django) с работающим Graph i QL; Например

query AllMsgsApp {
    allMessages {
        id
        message
    }
}

будет давать:

{
  "data": {
    "allMessages": [
      {
        "id": "TWVzc2FnZVR5cGU6MQ=="
        "message": "Some message..."
      }
    ]
  }
}

Интерфейс - это приложение React (с использованием create-response-app) и apollo-client и др.

Мой тестовый фрагмент в App.js:

import React, { Component } from 'react'
import { ApolloClient, InMemoryCache } from 'apollo-client-preset';
import { ApolloProvider } from 'react-apollo';
import { createHttpLink } from 'apollo-link-http';
import gql from 'graphql-tag'

const client = new ApolloClient({
  link: createHttpLink({ 
    uri: 'http://localhost:8000/gql/' }),
  cache: new InMemoryCache(),
});

client.query({
  query: gql`
    query AllMsgsApp {
      allMessages {
        id
        message
      }
    }
  `
}).then(response => console.log(response.data.allMessages))

После yarn start полученный ответ будет 400 Bad Request:

{"errors":[{"message":"Batch requests should receive a list, but received {'operationName': 'AllMsgsApp', 'variables': {}, 'query': 'query AllMsgsApp {
  allMessages {
    id
    message
    __typename
  }
}
'}."}]}

Зависимости

"dependencies": {
    "apollo-cache-inmemory": "^1.1.4",
    "apollo-client": "^2.0.4",
    "apollo-client-preset": "^1.0.5",
    "apollo-link-http": "^1.3.1",
    "graphql": "^0.12.0",
    "graphql-tag": "^2.6.0",
    "react": "^16.2.0",
    "react-apollo": "^2.0.4",
    "react-dom": "^16.2.0",
    "react-router-dom": "^4.2.2",
    "react-scripts": "1.0.17"
  }

Дополнительно

И, кстати, следующие:

curl -X POST -H "Content-Type: application/json" -d '{"query": "{ allMessages { id, message } }"}' http://localhost:8000/gql

в основном возвращает ту же ошибку:

{"errors":[{"message":"Batch requests should receive a list, but received {'query': '{ allMessages { id, message } }'}."}]}

Однако это вернет ожидаемый результат (обратите внимание на заключительный [ ]):

curl -X POST -H "Content-Type: application/json" -d '[{"query": "{ allMessages { id, message } }"}]' http://localhost:8000/gql

который:

[
  {
    "data":{
      "allMessages":[
        {
          "id":"TWVzc2FnZVR5cGU6MQ==",
          "message":"Some message..."
        }
      ]
    },
    "id":null,
    "status":200
  }
]

person Qingu Apsu    schedule 17.12.2017    source источник


Ответы (1)


Вместо использования createHttpLink используйте более новый BatchHttpLink.

Импортируйте так:

import { BatchHttpLink } from "apollo-link-batch-http";

а также

const client = new ApolloClient({
  link: new BatchHttpLink({ 
    uri: 'http://localhost:8000/gql/' }),
  cache: new InMemoryCache(),
});

Я надеюсь, это поможет. Это отправит пакетные запросы от Apollo, которые вы ожидаете от своего сервера.

person Anuj    schedule 09.01.2018