Почему мой запрос GraphQL на возврат одной записи не удался, а мой запрос на поиск всех записей работает нормально?

У меня есть база данных Mongo с коллекцией под названием "words", которая содержит такие документы:

{
  _id: "xxxx",
  word: "AA",
  definition: "Cindery lava"
}

У меня есть приложение узла, которое я использую для запроса и отображения информации из коллекции слов с помощью GraphQL. Я создал схему GraphQL и модель Mongoose, как показано ниже.

// Schema
const WordType = new GraphQLObjectType({
    name: 'Word',
    fields: () => ({
        id: {type: GraphQLID},
        word: { type: GraphQLString },
        definition: { type: GraphQLString },
    })
})

const RootQuery = new GraphQLObjectType({
    name: 'RootQueryType',
    fields: {
        detailsForWord: {
            type: WordType,
            args: {word: {type: GraphQLString}},
            resolve(parent, args) {
                return Word.find({word: args.word});
            }
        },
        allWords: {
            type: new GraphQLList(WordType),
            resolve(parent, args) {
                return Word.find({}).limit(100);
            }
        }
    }
});


// model 
const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const wordSchema = new Schema({
    word: String,
    definition: String,
});

Моя проблема в том, что запрос "allWords" работает отлично, но "detailsForWord" не работает вообще, и я понятия не имею, почему.

В GraphiQL я использую эти запросы:

{
  allWords {
    word
    definition
  }
}

... а также

{
  detailsForWord(word: "AA") {
    word
    definition
  }
}

Первый возвращает записи, но последний всегда возвращает следующее в GraphiQL:

{
  "data": {
    "detailsForWord": {
      "id": null,
      "word": null,
      "definition": null
    }
  }
}

Любые идеи, почему запрос "detailsForWord" не удается?

1 ответ

Решение

Очевидно, find возвращает массив документов, а findOne возвращает один документ. Поэтому запрос может быть успешным, вы получаете массив независимо от того, что с find. findOne возвращает документ, который вы ищете. Ваш запрос не дал сбоя, он вернул обещание с массивом.

если вы делаете

resolve(parent, args) {
            return Word.find({word: args.word}).then(c=>{console.log(c);return c})
}

Вы увидите массив, содержащий документ в консоли.

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