What is the correct type to use for an ObjectId field across mongoose and GraphQL?

后端 未结 3 450
清酒与你
清酒与你 2021-01-13 22:34

Following this tutorial, I have a mongoose model: (I\'m using the term \"Account\" instead of \"Todo\", but it\'s the same thing)

const Account = mongoose.m         


        
相关标签:
3条回答
  • 2021-01-13 22:58

    I used ID and it works fine! cause of your problem is not id's type! it's becuase you provide it with wrong value: ObjectID('actuall id')

    In order to fix this issue, call toJson function for each fetched data, or simply add a virtual id like this:

    YourSchema.virtual('id').get(function() {
        return this.toJSON()._id
    }
    
    0 讨论(0)
  • 2021-01-13 23:19

    I didn't find an issue and ran this code with one of my existing code bases. Except I wrapped the mutation in the GraphQLObjectType.

    const Mutation = new GraphQLObjectType({
        name: 'Mutation',
        fields: {
            addAccount: {
                type: AccountType,
                description: 'Create new account',
                args: {
                    name: {
                        name: 'Account Name',
                        type: new GraphQLNonNull(GraphQLString)
                    }
                },
                resolve: (root, args) => {
                    const newAccount = new Account({
                        name: args.name
                    });
    
                    newAccount.id = newAccount._id;
    
                    return new Promise((resolve, reject) => {
                        newAccount.save(err => {
                            if (err) reject(err);
                            else resolve(newAccount);
                        });
                    });
                }
            }
        });
    

    To get the working example: Clone the repo. In this repo, the app uses v0.13.2 and you are using v14.0.2 installed via npm i graphql. Downgrade graphql to v0.13.2.

    0 讨论(0)
  • 2021-01-13 23:21

    So what I just found is that _id is of type ObjectID but seems to implicitly cast to String. So if you define your mongoose model id type to be String instead of mongoose.Schema.Types.ObjectId then it should work. Using your current code (from the compose.com tutorial) that copies _id to id, the result will be that, in Mongo (after saving), the _id will be of type ObjectID and your model id will be of type string.

    In other words, instead of this

    const Account = mongoose.model('Account', new mongoose.Schema({
      id: mongoose.Schema.Types.ObjectId,
      name: String
    }));
    

    Do this

    const Account = mongoose.model('Account', new mongoose.Schema({
      id: String,
      name: String
    }));
    
    0 讨论(0)
提交回复
热议问题