Apollo ServerGraphQLNexusPrisma DateTimegraphql-iso-date

【Nexus・Prisma】DateTime 型を実装する

apollo-server-nexus-02 Apollo Server
スポンサーリンク

Prisma チームは現在、nexus-plugin-prisma の長期的に保守できるようにプラグインを書き直しているため、DateTimeタイプはサポートされていません。

そもそも、DateTime 型は GraphQL (または Nexus) でネイティブにサポートされていないため、最初にそれを GraphQL スキーマに追加する必要があります。 GraphQL スカラーの標準 ISO 日付実装は、graphql-iso-date npm パッケージから使用できます。

まず、パッケージをプロジェクトに追加します。

パッケージを追加する

try🐶everything backend$ yarn add graphql-iso-date
try🐶everything backend$ yarn add @types/graphql-iso-date --dev

新しい Types を指定する

以前記事の src/schema.ts を下記のように変更します。(Line 5、8)

// src/schema.ts

import { makeSchema } from "nexus";
import { join } from "path";
import * as types from "./graphql";

export const schema = makeSchema({
  types,
  outputs: {
    typegen: join(__dirname, "generated", "nexus-typegen.ts"),
    schema: join(__dirname, "generated", "schema.graphql"),
  },
});

DateTime タイプを定義する

src/graphql/DateTime.ts を作成します。

// src/graphql/DateTime.ts

import { GraphQLDateTime } from "graphql-iso-date";
export const DateTime = GraphQLDateTime;

// ❌ NOT WORKING
// import { asNexusMethod } from "nexus";
// export const DateTime = asNexusMethod(GraphQLDateTime, "date");

src/graphql/index.ts を作成します。

// src/graphql/index.ts

export { DateTime } from "./DateTime";
export { Post } from "./Post";
export { Profile } from "./Profile";
export { User } from "./User";

DateTime タイプを適用する

createdAtupdatedAt フィルドに DateTime 型を適用します。(Line 9-10、23-24)

src/graphql/Post.ts を作成します。

// src/graphql/Post.ts

import { objectType } from "nexus";

/*
  *** Prisma type ***
  model Post {
    id        Int      @id @default(autoincrement())
    createdAt DateTime @default(now())
    updatedAt DateTime @updatedAt
    title     String   @db.VarChar(255)
    content   String?
    published Boolean  @default(false)
    author    User     @relation(fields: [authorId], references: [id])
    authorId  Int
  }
*/

export const Post = objectType({
  name: "Post",
  definition(t) {
    t.nonNull.int("id");
    t.nonNull.field("createdAt", { type: "DateTime" });
    t.nonNull.field("updatedAt", { type: "DateTime" });
    t.nonNull.string("title");
    t.string("content");
    t.boolean("published");
    t.field("author", {
      type: "User",
      resolve: (parent, _, ctx) => {
        return ctx.prisma.user.findUnique({ where: { id: parent.id } }).user();
      },
    });
  },
});

※ Json 型 設定記事は ⬇︎⬇︎

全体記事

スポンサーリンク

参考文献

Removing nexus-plugin-prisma from your project

コメント

タイトルとURLをコピーしました