可选参数 - 突变 - TypeGraphQL

Posted

技术标签:

【中文标题】可选参数 - 突变 - TypeGraphQL【英文标题】:Optional argument - Mutation - TypeGraphQL 【发布时间】:2020-11-27 06:55:36 【问题描述】:

我想更新profile 实体的firstNamelastName

我希望用户能够同时更新它们或只更新其中之一。 但是我不知道如何进行突变以使参数之一(firstNamelastName)是可选的。

我的当前代码如果用户同时输入firstNamelastName,它就可以工作

  @Mutation(() => Boolean)
  @UseMiddleware(isAuth)
  async updateProfile(
    @Ctx() payload: MyContext,
    @Arg('firstName') firstName: string,
    @Arg('lastName') lastName: string,
  ) 

    try 
      const profile = await Profile.findOne(where:  user: payload!.userId)
      if (profile) 
        profile.firstName = firstName
        profile.lastName = lastName
        await profile.save();

        return true
      
      return false
     catch(err) 
      return false
    
  

如果我运行突变(不包括一个参数):

mutation
  updateProfile(firstName: "test")

我得到错误:

"message": "String!" 类型的字段 "updateProfile" 参数 "lastName" 是必需的,但未提供。

我在想一种解决方法可能是在 @Arg 中传递一个默认参数,但后来我意识到默认参数是静态的,而不是动态的,所以我不能为那个特定的配置文件传递 firstNamelastName

【问题讨论】:

【参考方案1】:

要使参数成为可选参数,请将第二个参数传递给@Arg 装饰,如下所示:

@Arg('firstName',  nullable: true ) firstName: string,
@Arg('lastName',  nullable: true ) lastName: string,

在 GraphQL 中,参数要么是必需的,要么不是。无法指定“只需要其中一个参数”。如果您需要这种验证逻辑,您需要自己在解析器中实现它。

【讨论】:

谢谢。您是否建议为每个参数创建一个突变?一个更新firstName,一个更新lastName?这可以是一个解决方案吗?我担心如果我走这条路,我会有太多的突变 这真的取决于你的用例。不过,根据经验,最好有更细粒度的查询和突变,以便将它们的意图更清楚地传达给使用它们的任何人。

以上是关于可选参数 - 突变 - TypeGraphQL的主要内容,如果未能解决你的问题,请参考以下文章

Spring + GraphQL - 可选授权

Dart语法之可选参数

C#中可选参数和具名参数的使用

Dart 知识点:可选参数必需参数

如何在 VS Code 中调试我的 typegraphql 解析器?

是否有必要在将可选参数传递给另一个可选参数之前检查它?