#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,
}
});
Надеюсь, это сработает 🙂