質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.32%
Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

166閲覧

API通信でfetchを使う場面と使わない場面の違いが分からない

begi-neer

総合スコア1

Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2025/03/08 07:30

現在、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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

解決しました。見間違えでした。

投稿2025/03/08 08:07

begi-neer

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.32%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問