現在、Next.jsを使いアプリ制作をしています。アプリの機能としてはCRUD操作やAI(Open AI)を使ったものになります。なので、その機能を実現させるためにAPIを作成しました。そこでデータベース(supabase)のCRUD操作に関してはfetchは使用せず、Open AIのほうに関してはfetchを使用しました。どちらもAPIを作成するという点は同じなのにやり方が違うはなぜなのか気になり質問させていただきました。初学者で至らない点も多いですが、回答していただけると幸いです。
・知りたいこと
fetchを使うときと使わないときの違いを知りたい。(データベース操作のAPIではfetchを使わないのに、Open AIのAPIではfetchを使うのはなぜか知りたい。)
・使用している技術
Next.js(typescript)
supabase, prisma
OpenAI API
コード
app/api/chatgpt/route.ts
typescript
1import { NextResponse } from "next/server"; 2 3export async function POST(req: Request) { 4 try { 5 const { prompt } = await req.json(); 6 7 const apiKey = process.env.OPENAI_API_KEY; 8 const apiEndPoint = process.env.OPENAI_API_URL; 9 10 if (!apiKey) { 11 console.error("API keyがありません。"); 12 return NextResponse.json( 13 { error: "API keyがありません。" }, 14 { status: 500 } 15 ); 16 } 17 18 if (!apiEndPoint) { 19 console.error("API URLがありません。"); 20 return NextResponse.json( 21 { error: "API URLがありません。" }, 22 { status: 500 } 23 ); 24 } 25 26 const response = await fetch(`${apiEndPoint}`, { 27 method: "POST", 28 headers: { 29 "Content-Type": "application/json", 30 Authorization: `Bearer ${apiKey}`, 31 }, 32 body: JSON.stringify({ 33 model: "gpt-4o-mini", 34 messages: [{ role: "user", content: prompt }], 35 max_tokens: 500, 36 stream: true, 37 temperature: 1.5 38 }), 39 }); 40 41 //API処理が正常にできない場合 42 if (!response.ok) { 43 console.error(`APIリクエスト失敗: ${response.status} ${response.statusText}`); 44 const errorData = await response.json(); 45 console.error("エラーメッセージ:", errorData); 46 return NextResponse.json( 47 { error: "APIリクエストが失敗しました。" }, 48 { status: response.status } 49 ); 50 } 51 52 // ストリームの処理 53 const reader = response.body?.getReader(); 54 const stream = new ReadableStream({ 55 async pull(controller) { 56 const { done, value } = await reader!.read(); 57 if (done) { 58 controller.close(); 59 return; 60 } 61 controller.enqueue(value); 62 }, 63 }); 64 65 return new Response(stream); 66 67 } catch (error) { 68 console.error("サーバーエラー:", error); 69 return NextResponse.json( 70 { error: "responseの取得に失敗しました。" }, 71 { status: 500 } 72 ); 73 } 74} 75
app/api/todo/route.ts
typescript
1import { NextResponse } from "next/server"; 2import { PrismaClient } from "@prisma/client"; 3 4const prisma = new PrismaClient(); // インスタンス化 5 6// データベースに接続する 7export async function main() { 8 try { 9 await prisma.$connect(); 10 } catch (err) { 11 return Error("DB接続に失敗しました"); 12 } 13} 14 15// 全タスクの取得API 16export const GET = async () => { 17 try { 18 await main(); 19 const alltodos = await prisma.todos.findMany(); 20 return NextResponse.json({message:"success", alltodos }, {status: 200}); 21 } catch (err) { 22 return NextResponse.json({message:"Error", err }, {status: 500}) 23 } finally { 24 await prisma.$disconnect(); 25 } 26} 27 28// タスク追加用API 29export const POST = async (req: Request, res: NextResponse) => { 30 try { 31 const jsondata = await req.json(); 32 const { title, description, continuedays, checkedDates, startdate, enddate, interval, color } = jsondata 33 const formattedStartDate = new Date(startdate.replace(/\//g, '-')); 34 const formattedEndDate = new Date(enddate.replace(/\//g, '-')); 35 await main(); 36 37 const posttodo = await prisma.todos.create({data: { title, description, continuedays, checkedDates, startdate:formattedStartDate, enddate:formattedEndDate, interval, color }}) 38 return NextResponse.json({message:"success", posttodo }, {status: 201}); 39 } catch (err) { 40 return NextResponse.json({message:"Error", error:err }, {status: 500}) 41 } finally { 42 await prisma.$disconnect(); 43 } 44}

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。