Graphql express вложенная схема - PullRequest
0 голосов
/ 07 мая 2020

В настоящее время я создаю приложение mern + graphql. Я новичок в graphql, и у меня есть две разные модели: модель пользователя и модель персонажа. Модель персонажа вложена в User. Когда я создаю пользователя в интерфейсе Graphiql, я хочу, чтобы он отображал его данные и символ, связанный с определенным пользователем c, но вместо этого он отображает каждый символ, который был создан в базе данных, и добавляет их к каждому созданному пользователю. вместо указанного c user. Пытаюсь понять, как это исправить. Ссылка на репозиторий Github

Пн goose Модель пользователя

const mongoose = require('../db/connection')
const Schema = mongoose.Schema

const User = new Schema({
    id: String,
    name: String,
    totalwins: Number,
    description: String,
    charactersID: [
        {
            type: Schema.Types.ObjectId,
            ref: "Character"
        }
    ]
})

module.exports = mongoose.model('User', User)

Пн goose Модель персонажа

const mongoose = require('mongoose')
const Schema = mongoose.Schema

const Character = new Schema({
    name: String,
    wins: Number,
    losses: Number,
    percentage: Number,
    image: String

})

module.exports = mongoose.model('Character', Character)
const graphql = require('graphql')
const { GraphQLSchema, GraphQLObjectType, GraphQLString, GraphQLInt, GraphQLID, GraphQLList, 
GraphQLNonNull } = graphql
const Character = require("../models/Character")
const User = require("../models/User")

Типы

// User Schema
const userType = new GraphQLObjectType({
name: 'User',
fields : () => ({
    _id: {type: GraphQLID},
    name : { type: GraphQLString},
    totalwins : { type: GraphQLInt },
    description :  { type: GraphQLString },
    character : {
        type : new GraphQLList(characterType),
        resolve(parent, args){
            return Character.find({charactersID: parent.id})

        }
    }

})
})



// Character Schema
const characterType = new GraphQLObjectType({
name: 'Character',
fields : () => ({
    id: {type: GraphQLID},
    name : { type: GraphQLString},
    wins : { type: GraphQLInt },
    losses :  { type: GraphQLInt },
    percentage: {type: (GraphQLInt)},
    image: { type: GraphQLString },
})
})

Запрос

//query the graph to grab the data
const Query = new GraphQLObjectType({
name: 'Query',
fields: {
    user : {
        type: userType,
        // arguments passed by the user while making the query
        args: {id : {type : GraphQLID}},
        resolve(parent, args){

            // return User.find((item) => { return item.id == args.id});
            //finding a single user by id
            return User.findById(args.id)

        }
    },

    users : {
        type: new GraphQLList(userType),
        resolve(parent, args) {
            return User.find({})
        }
    },

    character : {
        type: characterType,
        args: {id : {type : GraphQLID}},
        resolve(parent, args){

            return Character.findById(args.id)
        }
    },

    characters : {
        type: new GraphQLList(characterType),
        resolve(parent, args) {
            return Character.find({})
        }
    }


}
})

Мутации

 //allows user to add, update and delete to mondodb through graphql
 const Mutation = new GraphQLObjectType({
 name: 'Mutation',
 fields: {
    addUser: {
        type: userType,
        args: {
            name: {type: GraphQLNonNull(GraphQLString)},
            totalwins: {type: (GraphQLInt)},
            description: {type: (GraphQLString)},
            charactersID: { type: new GraphQLNonNull(GraphQLID)}
        },
        resolve(parent, args){
            let user = new User({
                name: args.name,
                totalwins: args.totalwins,
                description: args.description,
                charactersID: args.charactersID

            })
            return user.save()

        }


    },

    addCharacter: {
        type: characterType,
        args: {
            name: {type: GraphQLNonNull(GraphQLString)},
            wins: {type: (GraphQLInt)},
            losses: {type: (GraphQLInt)},
            percentage: {type: (GraphQLInt)},
            image: {type: (GraphQLString)},

        },
        resolve(parent, args){
            let character = new Character({
                name: args.name,
                wins: args.wins,
                losses: args.losses,
                percentage: args.percentage,
                image: args.image
            })
            return character.save()

        }
    },

    deleteUser: {
        type: userType,
        args: {
            id: {type: new GraphQLNonNull(GraphQLString)}
        },
        resolve(parent, args){
                const remUser = User.findByIdAndRemove(args.id)
                if(!remUser){
                    throw new Error('No character found')
            }
            return remUser

        }
    },

    deleteCharacter: {
        type: characterType,
        args: {
            id: {type: new GraphQLNonNull(GraphQLString)}
        },
        resolve(parent, args){
                const remCharacter = Character.findByIdAndRemove(args.id)
                if(!remCharacter){
                    throw new Error('No character found')
            }
            return remCharacter

        }
    },
}
})

module.exports = new GraphQLSchema({ query : Query, mutation : Mutation})

Изображение результатов из интерфейса Grapiql

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...