💨

Next.js API ルートと Prisma クライアントの非同期処理

に公開

はじめに

以下では、非同期処理(async/await)に慣れていない方向けに、

  1. どうやってコードを読むか
  2. どうやってコードを書くか
    の2点を解説します。

1. 非同期関数(async/await)のおさらい

  • async function:関数を非同期関数にするキーワード。戻り値は常に Promise
  • await:Promise の完了(resolve)を待ってから次の処理へ進む。
async function fetchData() {
    // ここで非同期処理を待つ
    const data = await fetch("https://api.example.com/data");
    return data.json();
}

2. コードを読む流れ

以下の例を読みながらポイントを押さえましょう。

import { PrismaClient } from "@prisma/client";
import { NextResponse }   from "next/server";

const prisma = new PrismaClient();

export const GET = async (req: Request) => {
  try {
    // ① Prisma からデータを取得
    const posts = await prisma.post.findMany();
    // ② 取得結果を JSON で返却
    return NextResponse.json(
      { message: "success", posts },
      { status: 200 }
    );
  } catch (err) {
    // ③ エラー時の返却
    return NextResponse.json(
      { message: "error", err },
      { status: 500 }
    );
  }
};
  1. インポート

    • PrismaClient:DB へのクエリを送るクライアント
    • NextResponse:Next.js のレスポンス生成ユーティリティ
  2. インスタンス生成

    const prisma = new PrismaClient();
    

    これで prisma.post.findMany() などのメソッドが使えるようになります。

  3. GET ハンドラー

    • async (req):非同期関数として宣言
    • try { await prisma... }:クエリ実行を待機
    • NextResponse.json():JSON レスポンスを返す

3. コードを書く手順

  1. ファイルの配置
    Next.js App Router では route.ts に置きます。

  2. 依存パッケージの準備

    npm install @prisma/client
    npx prisma generate
    
  3. インポート&クライアント生成

    import { PrismaClient } from "@prisma/client";
    const prisma = new PrismaClient();
    
  4. API ハンドラーの定義

    export const GET = async (req: Request) => { ... }
    
  5. DB クエリ

    const posts = await prisma.post.findMany();
    
  6. レスポンス返却

    return NextResponse.json({ message: "success", posts }, { status: 200 });
    

4. 実践例:エラーハンドリング付き GET

以下は「読みやすく」「書きやすい」構成のサンプルです。

import { PrismaClient } from "@prisma/client";
import { NextResponse }   from "next/server";

// グローバルにインスタンスを使い回すと接続コストを削減できる
const prisma = new PrismaClient();

export const GET = async (req: Request) => {
  try {
    // DB から全記事を取得
    const posts = await prisma.post.findMany();
    return NextResponse.json(
      { message: "success", posts },
      { status: 200 }
    );
  } catch (error) {
    console.error("DB Error:", error);
    return NextResponse.json(
      { message: "error", detail: error instanceof Error ? error.message : String(error) },
      { status: 500 }
    );
  }
};

5. まとめ

  • 読むとき: まず import → クライアント生成 → ハンドラーの流れを追う
  • 書くとき:
    1. インポート
    2. クライアント生成
    3. async 関数定義
    4. await でクエリ(try/catch で囲む)
    5. NextResponse.json で返却

この流れを意識すれば、非同期関数に不慣れでもスムーズに理解・実装できます。

Discussion