SyntaxError: Неожиданный токен <в JSON в позиции 0 при тестировании в Graphiql

Я изучаю GraphQL и новичок в этой технологии. Я не могу выяснить причину этой синтаксической ошибки. Когда я тестирую его на graphiql, он выдает неожиданную синтаксическую ошибку токена

Вот мой server.js:

const express = require("express");
const graphqlHTTP = require("express-graphql");
const schema = require("./schema");

const app = express();
app.get(
  "/graphql",
  graphqlHTTP({
    schema: schema,
    graphiql: true
  })
);

app.listen(4000, () => {
  console.log("Server listening to port 4000...");
});

Вот моя схема:

const {
  GraphQLObjectType,
  GraphQLString,
  GraphQLInt,
  GraphQLSchema,
  GraphQLList,
  GraphQLNotNull
} = require("graphql");

// HARD CODED DATA
const customers = [
  { id: "1", name: "John Doe", email: "jdoe@gmail.com", age: 35 },
  { id: "2", name: "Kelly James", email: "kellyjames@gmail.com", age: 28 },
  { id: "3", name: "Skinny Pete", email: "skinnypete@gmail.com", age: 31 }
];

// CUSTOMER TYPE
const CustomerType = new GraphQLObjectType({
  name: "Customer",
  fields: () => ({
    id: { type: GraphQLString },
    name: { type: GraphQLString },
    email: { type: GraphQLString },
    age: { type: GraphQLInt }
  })
});

// ROOT QUERY
const RootQuery = new GraphQLObjectType({
  name: "RootQueryType",
  fields: {
    customer: {
      type: CustomerType,
      args: {
        id: { type: GraphQLString }
      },
      resolve(parentValue, args) {
        for (let i = 0; i < customers.length; i++) {
          if (customers[i].id == args.id) {
            return customers[i];
          }
        }
      }
    },
    customers: {
      type: new GraphQLList(CustomerType),
      resolve(parentValue, args) {
        return customers;
      }
    }
  }
});

module.exports = new GraphQLSchema({
  query: RootQuery
});

Может ли кто-нибудь указать мне правильное направление? Я не могу понять проблему здесь?

2 ответа

Решение

Согласно документации для express-middleware, вы должны смонтировать промежуточное ПО, используя app.useв отличие от app.get:

app.use('/graphql', graphqlHTTP({schema, graphiql: true}))

Это сделает GraphiQL доступным в браузере, но также позволит вам сделать POST запросы к /graphql конечная точка. Используя app.getвы можете получить доступ к интерфейсу GraphiQL, но не можете POST Запросы. Когда вы делаете запрос в GraphiQL, он пытается сделать POST запрос к конечной точке, но, поскольку ваше приложение не настроено на его получение, запрос не выполняется. Ошибка, которую вы видите, является результатом попытки синтаксического анализа общих выражений ошибок для отсутствующего маршрута в JSON.

В моем случае это сообщение об ошибке было вызвано глупой ошибкой, поэтому, возможно, мой рассказ будет кому-то полезен:

Вместо того, чтобы иметь значение JSON с {"query":"graphqlQueryHere ..."}Я только что разместил простой запрос graphQL вместо JSON. Пожалуйста, посмотрите, что вы не делаете то же самое.

Другие вопросы по тегам