Closed8

PrismaとApollo ServerでGraphQLサーバーを構築する

まよねーづまよねーづ

schema.prisma内でenum定義したあと、nexusのobjectTypeでfield定義するときに、いちいち自分でenum再定義しなきゃいけない

https://github.com/graphql-nexus/nexus-plugin-prisma/issues/526
https://github.com/graphql-nexus/nexus-plugin-prisma/issues/858

とりあえず↓の感じでごまかしたけどいいやり方あるのかな
なんかどの書き方が正解なのかいまいちわからん、というかPrismaとNexusの関係性とかがわかってないのかも

userObject.ts
import { Role, Status } from "@prisma/client";
import { enumType, objectType } from "nexus";
import { User } from "nexus-prisma";

const roleEnum = enumType({
  name: "Role",
  members: Object.values(Role),
});
const statusEnum = enumType({
  name: "Status",
  members: Object.values(Status),
});

export const userObject = objectType({
  name: User.$name,
  description: User.$description,
  definition: (t) => {
    t.field(User.id);
    t.field(User.username);
    t.field(User.nickname);
    t.field(User.email);
    t.field(User.role.name, { type: roleEnum });
    t.field(User.status.name, { type: statusEnum });
    t.field(User.createdAt);
    t.field(User.updatedAt);
  },
});

まよねーづまよねーづ

resolver引数のctxに認証済みであるかどうかのフラグとか持たせたいけど型だけうまくあわない。

context.ts
export const context = async (ctx: ExpressContext) => {
  const authorization = ctx.req.headers.authorization || "";
  // console.log(authorization);
  // const tokenInfo = oAuth2Client.getTokenInfo(authorization);
  // console.log("tokenInfo", tokenInfo);

  // eslint-disable-next-line no-console
  // console.log(tokenInfo);
  // if (!tokenInfo) throw Error("No Token");
  return { prisma, hoge: "fuga" };
};

こんな感じにしてやるとresolver内でctx.hogeからfugaが取得できるんだけど型があわない

schema.ts
import { GraphQLEnumType } from "graphql";
import { GraphQLBigInt, GraphQLDateTime, GraphQLEmailAddress } from "graphql-scalars";
import { asNexusMethod, connectionPlugin, makeSchema } from "nexus";

import * as allTypes from "./schemas";

export const schema = makeSchema({
  types: [
    allTypes,
    asNexusMethod(GraphQLBigInt, "bigint", "bigint"),
    asNexusMethod(GraphQLDateTime, "datetime", "datetime"),
    asNexusMethod(GraphQLEmailAddress, "email", "email"),
    // asNexusMethod(GraphQLURL, "url", "url"),
    GraphQLEnumType,
  ],
  outputs: {
    schema: __dirname + "/generated/schema.graphql",
    typegen: __dirname + "/generated/nexus.ts",
  },
  contextType: {
    module: require.resolve("./context"),
    export: "Context",
  },
  sourceTypes: {
    modules: [
      {
        module: "@prisma/client",
        alias: "prisma",
      },
    ],
  },
  plugins: [
    connectionPlugin({
      extendConnection: {
        totalCount: { type: "Int", requireResolver: false },
      },
    }),
  ],
});

ここcontextTypeあたりが原因かも。context.tsでのcontext自体は型があってる

まよねーづまよねーづ

ついでにcontext関数の戻り値にContext型指定した。絶対このほうがいいじゃn

このスクラップは2022/02/11にクローズされました