Как мне принять массив строк с помощью Apollo Server и GQL?

#arrays #mongodb #graphql

#массивы #mongodb #graphql

Вопрос:

В настоящее время у меня есть файл typeDefs, который имеет пользовательский тип Books. Вот как это выглядит на данный момент:

 type: Books {
   bookId: String
   authors: [String]
   description: String
   title: String
}
 

Я использую MongoDB для хранения своих данных. Моя модель выглядит так:

 const bookSchema = new Schema({
  authors: [
    {
      type: String,
    },
  ],
  description: {
    type: String,
    required: true,
  },
  // saved book id from GoogleBooks
  bookId: {
    type: String,
    required: true,
  },
  title: {
    type: String,
    required: true,
  }
});
 

И мои преобразователи выглядят так:

 saveBook: async (parent, args, context) => {
            if (context.user) {
                const book = await Book.create({ ...args })

                await User.findByIdAndUpdate(
                    { _id: context.user._id },
                    { $addToSet: { savedBooks: { bookId: args.bookId } } },
                    { new: true }
                );

                return book;
            }

            throw new AuthenticationError('You need to be logged in!');
        }, 
 

Когда я использую graphql playground и отправляю данные в переменной запроса, я получаю сообщение об ошибке, которое String cannot represent a non string value: ["james", "jameson"]", при отправке

 {
    "input": {
    "bookId": "1",
    "authors": ["james", "jameson"],
    "description": "thdfkdaslkfdklsaf",
    "title": "fdjsalkfj;a",
  }
}
 

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

Ответ №1:

Сделайте typedef из author, а затем присвоите переменной author в книгах тип «Author».

Я думаю, вам также нужно определить массив в bookschema, если я не ошибаюсь.

И не забудьте убедиться, что имя модели в вашей базе данных должно быть таким же, как в вашем коде.

Вот так:

 type: Author {
   name: String
}

type: Books {
   bookId: String
   authors: [Author]
   description: String
   title: String
}
 
 const bookSchema = new Schema({
  authors: [
    {
      type: Author,
    },
  ],
  description: {
    type: String,
    required: true,
  },
  // saved book id from GoogleBooks
  bookId: {
    type: String,
    required: true,
  },
  title: {
    type: String,
    required: true,
  }
});
 

Надеюсь, это сработает 🙂