如何使用 graphql 和 mongoose 进行突变

Posted

技术标签:

【中文标题】如何使用 graphql 和 mongoose 进行突变【英文标题】:How to do a mutation with graphql and mongoose 【发布时间】:2021-02-17 12:32:30 【问题描述】:

我有一个带有mongoosegraphqlgraphql-compose-mongoose 的后端。

我按照graphql-compose-mongoosedocumentation创建了一个User模型和schema,如下:

型号

import mongoose,  Schema  from 'mongoose';
import  composeMongoose  from 'graphql-compose-mongoose';

export const UserSchema = new Schema(
    phone:  type: String ,
    name:  type: String ,
    email:     type: String, required: true ,
    password:  type: String, required: true ,

    photos:  type: Array ,
    matchId:  type: Schema.Types.ObjectId ,

    created:  type: Date, default: Date.now ,
    active:  type: Boolean, default: false 
);

export const User = mongoose.model('User', UserSchema);
export const UserTC = composeMongoose(User);

Graphql 架构

import  User, UserTC  from '../models/User';
import  schemaComposer  from 'graphql-compose';

schemaComposer.Query.addFields(
  userById: UserTC.mongooseResolvers.findById(),
  userByIds: UserTC.mongooseResolvers.findByIds(),
  userOne: UserTC.mongooseResolvers.findOne(),
  userMany: UserTC.mongooseResolvers.findMany(),
  userDataLoader: UserTC.mongooseResolvers.dataLoader(),
  userDataLoaderMany: UserTC.mongooseResolvers.dataLoaderMany(),
  userCount: UserTC.mongooseResolvers.count(),
  userConnection: UserTC.mongooseResolvers.connection(),
  userPagination: UserTC.mongooseResolvers.pagination()
);

schemaComposer.Mutation.addFields(
  userCreateOne: UserTC.mongooseResolvers.createOne(),
  userCreateMany: UserTC.mongooseResolvers.createMany(),
  userUpdateById: UserTC.mongooseResolvers.updateById(),
  userUpdateOne: UserTC.mongooseResolvers.updateOne(),
  userUpdateMany: UserTC.mongooseResolvers.updateMany(),
  userRemoveById: UserTC.mongooseResolvers.removeById(),
  userRemoveOne: UserTC.mongooseResolvers.removeOne(),
  userRemoveMany: UserTC.mongooseResolvers.removeMany()
);

const graphqlSchema = schemaComposer.buildSchema();

export default graphqlSchema;

我想创建一个具有 userCreateOne 突变的用户,我正在 GraphQL 操场上进行尝试。我似乎无法弄清楚如何。我试过将该字段作为参数传递,但它不起作用。

【问题讨论】:

【参考方案1】:

最后我确实想通了。突变看起来像这样:

mutation 
  userCreateOne(record: email: "email@example.com", password: "12345") 
    record 
      email
      password
      matchId
      created
      active
    
  

userCreateOne(和猫鼬解析器createOne)接受一个对象record,该对象内部是您在架构中定义的字段。

【讨论】:

你知道这是为什么吗?如果有办法解决这个问题,因为使用查询不需要使用“记录”。

以上是关于如何使用 graphql 和 mongoose 进行突变的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Mongoose 与 GraphQL 和 DataLoader 一起使用?

GraphQL、Relay 和 Mongodb (mongoose) 如何获取数组

graphql + mongoose + typescript,如何减少重复的模型定义

如何在本地使用带有 express 的 graphql 和带有 mongoose 的 mongodb 来检索文档?

如何使用带有 Mongoose 和 ES6 承诺的 Graphql 中的 find 来解析多条记录

如何仅通过 mongoose 传递我在 GraphQL 中需要的数据