OpenAI API 接入 Next.js 怎么做?Route Handler + 流式 + 报错处理完整流程
在 Next.js 接 OpenAI API 的正确姿势:API Key 放服务端、用 App Router 的 Route Handler 调用、流式返回、处理 401/429/quota 报错,绝不在前端暴露 key。附可直接用的 route.ts 代码。
Published: 2026-06-05 / Updated: 2026-06-26
在 Next.js 里接 OpenAI API,第一条铁律:API Key 只能放服务端,绝不能出现在前端代码或 NEXT_PUBLIC_ 变量里。前端直接调 OpenAI 会把 key 暴露给所有访客,几分钟就被盗刷。正确做法是用 App Router 的 Route Handler 在服务端中转。
第一步:装 SDK + 配 Key
npm install openai
在 .env.local 里配 key(不要加 NEXT_PUBLIC_ 前缀):
OPENAI_API_KEY=sk-xxxxx
.env.local 必须进 .gitignore,别提交进仓库。
第二步:写服务端 Route Handler
新建 app/api/chat/route.ts,在服务端调用 OpenAI:
import OpenAI from "openai";
export const runtime = "nodejs";
const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
export async function POST(req: Request) {
const { messages } = await req.json();
const completion = await openai.chat.completions.create({
model: "gpt-4o-mini", // 以 OpenAI 官方当前可用模型为准
messages,
});
return Response.json({ reply: completion.choices[0].message });
}
前端只 fetch("/api/chat", { method: "POST", body: ... }),key 全程留在服务端。
第三步:流式返回(边生成边显示)
聊天体验的关键是流式(不让用户干等)。开 stream: true,把流转发给前端:
const stream = await openai.chat.completions.create({
model: "gpt-4o-mini",
messages,
stream: true,
});
const encoder = new TextEncoder();
return new Response(new ReadableStream({
async start(controller) {
for await (const chunk of stream) {
const text = chunk.choices[0]?.delta?.content || "";
if (text) controller.enqueue(encoder.encode(text));
}
controller.close();
},
}), { headers: { "Content-Type": "text/plain; charset=utf-8" } });
前端用 response.body.getReader() 逐块读,追加到界面。
常见报错和修复
- 401 Incorrect API key provided:key 错、过期、或没读到 → 检查
.env.local拼写、重启 dev(环境变量启动时才读)。 - 429 Rate limit / insufficient_quota:超频或余额不足 → 看 OpenAI 后台用量;加重试退避;
insufficient_quota是要充值,不是限流。 - key 在前端被暴露:说明你在客户端组件直接调了 OpenAI → 立刻挪到 Route Handler,并在 OpenAI 后台吊销并换新 key。
- 生产 undefined:本地有
.env.local,但 Vercel 没配 → 在 Vercel 环境变量补OPENAI_API_KEY并重新部署。
安全清单(上线前必看)
- key 只在服务端,前端零暴露;
.env*已 gitignore;- 加基本的频率限制 / 鉴权,别让
/api/chat被人白嫖你的额度; - 设 OpenAI 后台用量上限,防止被刷爆。
让 Codex 辅助
我在 Next.js App Router 接 OpenAI,报 [贴报错]。
我的 key 放在 .env.local / 前端 / Vercel。请判断是 key、环境变量还是流式处理问题,
给出修复,并确认我的 key 没有暴露在客户端。
风险提醒
- 别把 key 写进代码、截图、或
NEXT_PUBLIC_;一旦泄露立刻吊销换新。 - 帮客户接 API 用客户自己的 key 和账号,别用你的额度承担客户用量。
相关工具
相关 AI 接入
接其他模型 / 管好 key 一起看:
免责声明
本文 SDK 用法与 Route Handler 形态对应 OpenAI 与 Next.js 的通用行为;具体模型名、价格、限额以 OpenAI 官方文档为准,涉及客户密钥与账单时需明确授权并人工复核。
读完后可以直接用的工具
根据这篇文章的主题自动匹配,先用工具做判断,再人工复核交付。
SEO path
Continue through the same topic network
Question entrances
Use a practical tool after reading this guide
先用工具做判断,再用模板整理交付。生成内容只能作为草稿,不要不审核就直接发给客户。
Related articles
需要人工协助配置或排错?
你可以先用本站工具和模板自助排查。若确实卡在 Codex、Claude Code、GitHub、Vercel 配置或客户需求判断上,可以通过联系页咨询。服务不是主业入口,只作为少量高价值人工协助保留。
联系我