GraphQL response formatting


間違いさえすれば終わりだと思ってるの?違うよ!まだ返事はありますか?


間違いさえすれば終わりだと思っていたが、反応を直す必要もある.実際、GraphQLを考えると、まず最初に思いついたのは応答から着手することで、初めてサーバーを開いたときにエラーが発生したためか、エラーを修正しました.
いずれにしても、デフォルトでは解析器を設定したときに返される値がその解析器のターゲットオブジェクトであるため、応答も手動です.
@Mutation(() => User)
  async signup(
    @Arg("data") data: SignupRequest,
    @Ctx("ctx") ctx: Context
  ): Promise<User | null> {
    ctx.prisma.user.create({
      data: {
        username: data.username,
        password: data.password,
        email: data.email,
        nickname: data.nickname
      }
    });
  }
例えば、会員加入のためにUserResolverを上記のように作成する.公式サイトGitHubの例のコードを参照して作成し、通常はこのようにコードを記述します.
mutation {
  signup(data: {
    username: "test user"
    password: "I'am test user"
    email: "[email protected]"
    nickname: "test"
  })
}
GraphQLのプロパティのため、リクエストを発行するときに返される値を明記する必要があります.したがって、上述したように、要求のみを送信して返信を受け付けない場合にはエラーが発生する.
したがって、戻り値を設定しようとすると、生成したuserオブジェクトの値(ユーザー名、パスワード、email、ニックネームなど)が取得されます.これはすぐに欲しくない動作になります.
これは、Postmanに要求を送信し、暗号化されたパスワードを返すことができることを意味します.通常、暗号化されたコードはGitHubにアップロードされるので、少なくともどのように暗号化されるかがわかります.これは完全に悪用される可能性があると言える.

どうやってこの問題を解決できますか?


そこで,上記で定義した方法で返される値をPromise<string>に変更したが,これによっても誤りが生じるため,数時間悩んだ.
このとき、@Mutation()で指定された返却値が本当に重要かどうかが重要だと思います.コード中Promsie<User | null>すぐのtypescriptコンパイルで選択されますが、GraphQL実行時signup返される値は@Mutation()で指定した値です.
import { ObjectType, Field } from "type-graphql";

@ObjectType()
export class HttpResponse {
  @Field()
  message!: string;

  @Field()
  status!: number;
}
したがって、上記に必要な応答対象を定義した後、@Mutation()で戻り値をHttpResponseに指定する.

したがって、リクエストを送信すると、デフォルトでエラーが発生しないと判断できます.

振り返る


実際、この問題を解決するためにヒントを得たのは、私の2番目の文章から得たことです.読んでいるうちに、@Mutation()に戻り値が指定されていないことによるエラーが見られます.
前に出た問題を整理すれば、後でこのような方法で助けられるかもしれません.もちろん、そのためでなくても、これから何が起こるか分からないので、発生した話題はドキュメントで詳しく記録したほうがいいです.
また、ApolloServerの例を作成する際には、formatResponseの選択肢もありますので、この選択肢を知っておくと良いでしょう.この部分は前に処理したことのない話題を処理する可能性があるからです.