PR
Apollo ServerGraphQLNexusPrismaReact Native Json型

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

apollo-server-nexus-02 Apollo Server

この記事は 2023 年 10 月時点の記録です(2026 年 7 月 追記)

手順は今も同じです。graphql-scalars のスカラーを asNexusMethod で登録して、types に含める——という流れで動きます。

ひとつ補足があります。この記事のやり方が「うまくいったほう」です。

DateTime の記事では asNexusMethod を諦めていました

同じ時期に書いたDateTime 型の記事では、asNexusMethod を「NOT WORKING」としてコメントアウトしています。そちらでは graphql-iso-date を使っていました。

一方こちらの Json の記事では、最初から graphql-scalars を使っていて、asNexusMethod が問題なく動いています。

  • graphql-iso-date + asNexusMethod → 動かなかった
  • graphql-scalars + asNexusMethod → 動いた

つまり、問題は Nexus 側ではなくスカラーを提供するパッケージ側だった可能性が高いということです。graphql-iso-date は「スカラーは graphql-scalars リポジトリに移動した」と公式に告知されており、更新も止まっています。

DateTime も同じように書けます。移行するならこちらです。

import { asNexusMethod } from 'nexus';
import { DateTimeResolver, JSONObjectResolver } from 'graphql-scalars';

export const DateTime = asNexusMethod(DateTimeResolver, 'dateTime');
export const Json = asNexusMethod(JSONObjectResolver, 'json');

こうしておくと objectType の中で t.nonNull.dateTime('createdAt')t.nonNull.json('jsondata1') のようにメソッドとして書けます。型名を文字列で書かずに済むので、綴り間違いをその場で検出できます。

※ 上記は 2026 年 7 月時点の各パッケージの公開情報と、当サイトの 2 記事の実装結果を突き合わせた整理です。改めて動作検証を行ったものではありません。

Error: NEXUS__UNKNOWN__TYPE was already defined and imported as a type, check the docs for extending types

⬆︎ DateTime 型と同じく、Json 型も追加する必要があります。
( ※ DateTime 型 設定記事は こちら )

スポンサーリンク

パッケージを追加する

graphql-scalars パッケージをインストールして設定を行います。

try🐶everything backend$ yarn add graphql-scalars

Json を定義する

src/graphql/Json.ts ファイルを作成します。

// src/graphql/Json.ts

import { asNexusMethod } from "nexus";
import { JSONObjectResolver } from "graphql-scalars";

export const Json = asNexusMethod(JSONObjectResolver, "json");

src/graphql/index.ts を編集します。(Line 6)

// src/graphql/index.ts

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

src/graphql/Post.ts で例えると、Line 8、9 のような書き方で使えます。

// src/graphql/Post.ts 

...
export const Post = objectType({
  name: "Post",
  definition(t) {
    t.nonNull.int("id");
    t.nonNull.field("jsondata1", { type: "JSONObject" });
    t.nonNull.field("jsondata2", { type: "JSONObject" });
    t.nonNull.string("title"
...

まとめ

注意すべきことは、
{ type: "Json" } ではなく、{ type: "JSONObject" }で定義することです!

スポンサーリンク

コメント

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