简体   繁体   中英

Writing Nested GraphQL Mutations

I am looking for examples of writing nested mutations. I am making a mutation for a recipe object and the schema looks like this:

const RecipeType = new GraphQLObjectType({
  name: "Recipe",
  fields: () => ({
    id: { type: GraphQLID },
    name: { type: GraphQLString },
    dateCreated: { type: GraphQLString },
    authorID: { type: GraphQLID },
    prepTime: { type: PrepTimeType },
    cookTime: { type: CookTimeType },
    ingredients: { type: new GraphQLList(IngredientType) },
    steps: { type: new GraphQLList(StepType) }
  })
});

const PrepTimeType = new GraphQLObjectType({
  name: "PrepTime",
  fields: () => ({
    quantity: { type: GraphQLFloat },
    unit: { type: GraphQLString }
  })
});

const CookTimeType = new GraphQLObjectType({
  name: "CookTime",
  fields: () => ({
    quantity: { type: GraphQLFloat },
    unit: { type: GraphQLString }
  })
});

const IngredientType = new GraphQLObjectType({
  name: "Ingredients",
  fields: () => ({
    name: { type: GraphQLString },
    quantity: { type: GraphQLFloat },
    unit: { type: GraphQLString }
  })
});

const StepType = new GraphQLObjectType({
  name: "Ingredients",
  fields: () => ({
    details: { type: GraphQLString },
    estimatedTime: { type: GraphQLFloat },
    unit: { type: GraphQLString }
  })
});

I am looking to write a mutation that creates an entire object for this item. The mutation looks like the following:

createRecipe: {
  type: RecipeType,
  args: {
    // Required Args
    name: { type: new GraphQLNonNull(GraphQLString) },
    authorID: { type: new GraphQLNonNull(GraphQLID) },
    ingredients: { type: new GraphQLList(IngredientType) },
    steps: { type: new GraphQLList(StepType) },
    // Not required args
    prepTime: { type: PrepTimeType },
    cookTime: { type: CookTimeType },
  },
  resolve(parent, args) {
    let recipe = new Recipe({
      name: args.name,
      dateCreated: new Date().getTime(),
      authorID: args.authorID,
      ingredients: args.ingredients,
      steps: args.steps
    });

    // Check for optional args and set to recipe if they exist
    args.prepTime ? recipe.prepTime = args.prepTime : recipe.prepTime = null;
    args.cookTime ? recipe.cookTime = args.cookTime : recipe.cookTime = null;

    return recipe.save();
  }
}

I am not sure how to create one mutation that creates the entire object. and then updating will be a further challenge. Does anyone have any examples or links to the docs that support this? From what I can tell GraphQL hasn't covered this in a helpful manner.

I am currently getting the following errors:

{
  "errors": [
    {
      "message": "The type of Mutation.createRecipe(ingredients:) must be Input Type but got: [Ingredients]."
    },
    {
      "message": "The type of Mutation.createRecipe(steps:) must be Input Type but got: [Steps]."
    },
    {
      "message": "The type of Mutation.createRecipe(prepTime:) must be Input Type but got: PrepTime."
    },
    {
      "message": "The type of Mutation.createRecipe(cookTime:) must be Input Type but got: CookTime."
    }
  ]
}

Any support would be greatly appreciated.

Cheers,

I figured this out. I needed to create input types for each subdocument. I already had the object types but for the mutations, I had to add new ones. From there I placed it into the mutation as such.

createRecipe: {
  type: RecipeType,
  args: {
    // Required Args
    name: { type: new GraphQLNonNull(GraphQLString) },
    authorID: { type: new GraphQLNonNull(GraphQLID) },
    ingredients: { type: new GraphQLList(IngredientInputType) },
    steps: { type: new GraphQLList(StepInputType) },
    // Not required args
    prepTime: { type: PrepTimeInputType },
    cookTime: { type: CookTimeInputType },
  },
  resolve(parent, args) {
    let recipe = new Recipe({
      name: args.name,
      dateCreated: new Date().getTime(),
      authorID: args.authorID,
      ingredients: args.ingredients,
      steps: args.steps
    });

    // Check for optional args and set to recipe if they exist
    args.prepTime ? recipe.prepTime = args.prepTime : recipe.prepTime = null ;
    args.cookTime ? recipe.cookTime = args.cookTime : recipe.cookTime = null ;

    return recipe.save();
  }
},

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM