Запрос GraphQL возвращает ошибку «Невозможно вернуть значение NULL для поля, не допускающего значения NULL»

У меня есть базовая настройка запроса GraphQL следующим образом:

Query.js:

const Query = {
    dogs(parent, args, ctx, info) {
        return [{ name: 'Snickers' }, { name: 'Sunny' }];
    },
};

module.exports = Query;

schema.graphql:

type Dog {
    name: String!
}
type Query {
    dogs: [Dog]!
}

Я создал функцию createServer() для запуска сервера следующим образом:

const { GraphQLServer } = require('graphql-yoga');
const Mutation = require('./resolvers/Mutation');
const Query = require('./resolvers/Query');
const db = require('./db');

function createServer() {
    return new GraphQLServer({
        typeDefs: 'src/schema.graphql',
        resolvers: {
            Mutation,
            Query,
        },
        resolverValidationOptions: {
            requireResolversForResolveType: false,
        },
        context: req => ({ ...req, db }),
    });
}

module.exports = createServer;

Затем я попытался запросить dogs следующим образом:

query {
  dogs {
    name
  }
}

Но вместо того, чтобы получить имена из массива собак, я получил следующую ошибку:

{
  "data": null,
  "errors": [
    {
      "message": "Cannot return null for non-nullable field Query.dogs.",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "dogs"
      ]
    }
  ]
}

Что, кажется, вызывает эту ошибку?

Похоже, вы неправильно импортируете Query.js или ваши преобразователи настроены неправильно. Покажите остальную часть соответствующего кода, включая то, как вы создаете объект преобразователей и как вы предоставляете определения типов и преобразователи в конструктор GraphQLServer.

Daniel Rearden 01.01.2019 13:49

@DanielRearden Хорошо, держись.

AndrewL64 01.01.2019 13:49

@DanielRearden Мой prisma.graphql содержит более 300 строк кода. Следует ли мне скопировать определенную часть или вы хотите, чтобы я скопировал все?

AndrewL64 01.01.2019 13:52

Не уверен, актуальны ли какие-либо другие определения типов. Я ожидаю, что у вас есть код, который выглядит примерно так: github.com/prisma/prisma-examples/blob/master/typescript/… и, возможно, отдельный файл, подобный этому github.com/prisma/prisma-examples/blob/master/typescript/…

Daniel Rearden 01.01.2019 13:56

@DanielRearden Вопрос обновлен !!

AndrewL64 01.01.2019 14:01

Странно, я могу запустить сервер graphql-yoga с указанными выше typeDefs и резолверами без проблем. Если ./resolvers/Query не является правильным путем для Query, я не уверен, что еще может быть неправильным: /

Daniel Rearden 01.01.2019 14:23

Если бы это был неправильный путь, узел не смог бы его разрешить и выдал бы ошибку: "Error: Cannot find module ...", и сервер не работал бы. Похоже, что он разрешается, но в пустой объект, поэтому преобразователя dogs там нет. Вы уверены, что экспорт Query.js верен?

Ionut Achim 01.01.2019 15:01

@IonutAchim Есть ли способ проверить правильность экспорта Query.js? Я добавил console.info("Query: " + Query) в функцию createServer(), и он вернул Query: [Object Object].

AndrewL64 01.01.2019 15:20

@AndrewL, лучший способ - проверить экспорт модуля. Журнал консоли может вводить в заблуждение. Если вы ничего не экспортируете, он будет преобразован в пустой объект. Так что просто просмотрите файл и посмотрите, что у вас за экспорт.

Ionut Achim 01.01.2019 15:23
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
6
9
8 921
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Приведенный выше код работает, как вы можете видеть в codeandbox: https://codesandbox.io/s/olzj9vvpk5

Но когда я конвертирую Query во что-то вроде {}, он возвращает ту же ошибку, поэтому проверьте свои пути и console.info Query, чтобы проверить путь. Ваш экспорт выглядит правильно, но вы, возможно, забыли сохранить файл, как я вижу из начальных файлов курса. Запрос - это {}. Пожалуйста, проверьте дважды.

Также, если этот код находится в общедоступном репозитории git, поделитесь ссылкой.

Проблема была в опечатке в одном из моих файлов. Я отметил ваш ответ как правильный, потому что ваш код помог мне найти опечатку. Ваше здоровье.

AndrewL64 06.02.2019 07:31

Я знаю, что на этот вопрос был дан ответ, но для меня единственное, что устранило эту проблему, - это также передать аргумент информации.

В моем случае я создаю новый файл Query.js в папке src, но импортирую Query с Query = require ('./ resolvers / Query') и кодирую там. Итак, попробуй проверить путь, думаю проблема в этом.

Эта проблема возникает из-за того, что AWS требует определенных стандартных значений в таблице DynamoDB, таких как createdAt и updatedAd, просто добавьте эти поля вручную с меткой времени в Dynamo db для дальнейшего тестирования. Мутацию всегда нужно запрашивать через id, мне это почему-то было непонятно, когда моя схема создавалась с помощью ampify codegen ...

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