この記事は 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" }で定義することです!

コメント