0

i am working on a project based on GraphQL API with nodejs And mongoose so i have this Model Below :

const mongoose = require('mongoose')
const BreakingNewsSchema = new mongoose.Schema({
MainInfo:{
    content:{type:String,required:true},
    ParentCategory:{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'ArticleCategory',
        required: true
    },
    category:{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'ArticleCategory',
        required: true
    },
},
options:{
    clickable:{type:Boolean,required:true},
    link:{type:String,required:false},
    isActive:{type:Boolean,required:true,default:true}
},
infos:{
    createdAt: { type: String, required: true},
    updateDate: {type: String, required: false},
    createdBy: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "User",
        required: true
    },
    updatedBy: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "User",
        required: false,
    }}} ,{
timestamps: true})
module.exports = mongoose.model("BreakingNews", BreakingNewsSchema)

and i have this GraphQL Schema here :

const BreakingType = new GraphQLObjectType({
name: "BreakingNews",
fields: () => ({
    id: {
        type: GraphQLID
    },
    MainInfo: {
        type: new GraphQLObjectType({
            name: "BreakingMainInfo",
            fields: () => ({
                content: {
                    type: GraphQLString
                },
                ParentCategory: {
                    type: CategoryType,
                    resolve(parent, args) {
                        return Category.findById(parent.MainInfo.parentCategory)
                    }
                },
                category: {
                    type: CategoryType,
                    resolve(parent, args) {
                        return Category.findById(parent.MainInfo.category)
                    }
                }

            })
        })

    },
    options: {
        type: new GraphQLObjectType({
            name: "BreakingOptions",
            fields: () => ({
                clickable: {
                    type: GraphQLBoolean
                },
                link: {
                    type: GraphQLString
                },
                isActive: {
                    type: GraphQLBoolean
                }

            })
        })
    },
})})

For the breakingNews Collection in Mongodb

and below i have the Category Collection ... so here is the Category Model :

const CategorySchema = new mongoose.Schema({
MainInfo:{
    title: {
        type: String,
        required: true,
        unique: true
    },
    slug: {
        type: String,
        required: false,
        unique: true
    },
},
seo:{
    metaDescription: { type: String, required: false },
    metaKeywords: [{
        type: String,
        required: false
    }]
},
options:{
    isParent:{type:Boolean,required:true},
    isEnded:{type:Boolean,required:true},
    parentCategory: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "ArticleCategory",
        required: false,
        set: v => v === '' ? null : v
    }
},
info:{
    createdBy: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "User",
        required: true
    },
    updatedBy: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "User",
        required: false
    },
    articleCount:{type:Number,required:false},
    oldId: { type: String, required: false }
}}, {
timestamps: true})
module.exports = mongoose.model("ArticleCategory", CategorySchema)

And finally i have the ArticleCategory Schema for GraphQL :

const CategoryType = new GraphQLObjectType({
name: "ArticleCategory",
fields: () => ({
    id: {
        type: GraphQLID
    },
    MainInfo: {
        type: new GraphQLObjectType({
            name: "ArticleCategoryMainInfo",
            fields: () => ({
                title: {
                    type: GraphQLString
                },
                slug: {
                    type: GraphQLString
                }
            })
        })
    },
    seo: {
        type: new GraphQLObjectType({
            name: "ArticleCategorySeo",
            fields: () => ({
                metaDescription: {
                    type: GraphQLString
                },
                metaKeywords: {
                    type: new GraphQLList(GraphQLString)
                }
            })
        })
    },
    options: {
        type: new GraphQLObjectType({
            name: "ArticleCategoryOptions",
            fields: () => ({
                isParent: {
                    type: GraphQLBoolean
                },
                isEnded: {
                    type: GraphQLBoolean
                },
                parentCategory: {
                    type: CategoryType,
                    resolve(parent, args) {
                        return Category.findById(parent.options.parentCategory)
                    }
                }
            })
        })
    }
})})

The problem is when i try to execute this query on graphQL:

query{
  ActiveBreakingNews{
     id
     MainInfo{
       content
       ParentCategory {
          id
       }
       category{
          id
       }
     }
  }
}

I get this error Cannot read properties of undefined (reading 'category') or Cannot read properties of undefined (reading 'category')

i find out its a problem find resolve function in the schema ... but i don't know what the wrong and what should i do to fix it ... please Help and thanks in advance

elie mardelly
  • 79
  • 2
  • 10
  • Look at the line: `return Category.findById(parent.MainInfo.category)` - when this is executed `parent.MainInfo` is `undefined`. Use your debugger to examine the value of `parent` in that context to ensure it is what you expect. This may just be a problem with the data you are querying. – Michel Floyd Oct 22 '22 at 18:51

0 Answers0