Создать тип Graphql из схемы mongoose с подполями
Я начинаю создавать сервис Graphql, который будет работать вместе с API REST, уже работающим на производстве, с использованием NodeJS и Mongoose, но у меня возникли проблемы с поиском способа преобразования моей схемы mongoose в тип GraphQL.
У меня есть следующая схема:
var userSchema = new mongoose.Schema({
name: {type: String, required: true},
email: {type: String},
imageURL: {type: String, default:null},
providerId: {type: String, required: true},
token: {type: String, required: true},
history: [{
orders:[{type: mongoose.Types.ObjectId, ref:'Order'}],
restaurant: {type: mongoose.Types.ObjectId, ref: 'Restaurant'}
}]
}, { timestamps: true});
Так что, в принципе, проблема в том, history
поле. Это поле представляет собой список объектов с 2-мя подполями: orders (список объектов, ссылающихся на другую схему mongoose) и restaurant (которые ссылаются на схему mongoose для restaurant).
Мой главный вопрос: при написании соответствующего типа GraphQL для "Пользователь", есть ли способ создать подполя, как я делал с мангуста на history
или я должен создать второй тип, а затем ссылаться на этот тип (зная, что приложению не нужно создавать другую схему в mongoose, которую можно создавать только в GraphQL).
1 ответ
Как вы сказали, когда вы пишете свою схему GraphQL, история должна быть отдельным типом, как, вероятно, Order и Restaurant. Используя Apollo, определения типа схемы будут выглядеть примерно так:
type User {
# additional fields
history: [Record!]!
}
type Record {
orders: [Order!]!
restaurant: Restaurant
}
В дополнение к определениям типов, приведенным выше, вы также предоставили бы распознаватель для пользователя. В этом случае распознаватель просто вернет User.findOne()
(или, тем не менее, вы обычно получаете объект User из своей базы данных).
Вот хорошая часть: вам, возможно, даже не понадобятся резольверы для Order, Restaurant или даже History. Если вы не укажете средство распознавания, GraphQL будет использовать средство сопоставления по умолчанию, которое с радостью использует передаваемый объект (независимо от того, какой кусок объекта User вы передадите в преобразователе для типа User). Если он найдет в этом объекте ключи, соответствующие полям, указанным в определении типа схемы GraphQL, он заполнит эти поля и проигнорирует все остальное.
Конечно, если вам нужен дополнительный контроль (возможно, ваши ключи объектов и имена полей не совпадают), вы всегда можете написать решатель самостоятельно.