如何用Next.js和DeepSeek API构建聊天界面

落明吖_2625

落明吖_2625

2026-05-20

958人浏览

原创

next.js app router中需通过route handler(如app/api/chat/route.ts)代理调用deepseek api,服务端用fetch转发请求并设置stream:true、响应头content-type:text/event-stream,客户端用readablestream+textdecoderstream解析sse流,避免cors/401错误及渲染异常。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

如何用next.js和deepseek api构建聊天界面

Next.js App Router 中如何正确调用 DeepSeek API

DeepSeek API 不支持浏览器直连,必须通过服务端代理请求,否则会遇到 CORS 或 401 错误。Next.js 的 app/ 目录下,所有带 async 的 Server Component 都不能直接发 fetch 到外部 API(因为没有 Authorization header 支持),得用 Route Handler。

实操建议:

  • 在 app/api/chat/route.ts 创建 POST 路由,用 fetch 转发请求到 https://api.deepseek.com/v1/chat/completions
  • 把 DEEPSEEK_API_KEY 存在 .env.local 并用 process.env.DEEPSEEK_API_KEY 读取——绝不能暴露在客户端组件里
  • 请求体必须包含 model: "deepseek-chat"、messages(格式同 OpenAI)、stream: true(如需流式)
  • 响应头加 Content-Type: text/event-stream 和 Cache-Control: no-cache,否则 Safari 可能卡住

如何在 Client Component 中安全接收并渲染流式响应

Next.js 的 Client Component 无法直接读取流式 Response.body,必须用 ReadableStream + TextDecoderStream 解析 SSE 数据。常见错误是直接 response.json(),结果报 Unexpected end of JSON input。

实操建议:

  • 用 useEffect + AbortController 控制请求生命周期,避免组件卸载后更新 state 报错
  • 每条 SSE event 是 data: { ... }\n\n 格式,需手动 split('data: ').filter(Boolean) 提取 JSON 字符串
  • DeepSeek 返回的 delta.content 可能为空字符串或 undefined,渲染前要判空:if (delta?.content)
  • 不要用 useState 累加完整回复,而是用 useRef 存原始消息数组,再用 useMemo 拼接显示内容,避免重复渲染

为什么用 generateId() 而不是 Math.random() 做 message id

聊天界面中每条消息需要稳定 ID 用于滚动定位和 DOM 更新。用 Math.random().toString(36).slice(2) 在 React Strict Mode 下会触发两次渲染,导致 ID 不一致、滚动错乱甚至 key warning。

chartjs-reporter
chartjs-reporter

此技能用于在用户需要将结构化数据(查询结果、CSV 摘要、JSON 记录或 Python 字典/列表)转换为独立的 HTML 页面时使用。

下载

实操建议:

  • 用 @paralleldrive/cuid2 或 nano-id 生成确定性 ID:import { createId } from 'nanoid'; const id = createId();
  • 如果只在客户端生成,确保 ID 在 useEffect 外、但 useState 初始化时生成,例如:const [messages, setMessages] = useState([{ id: createId(), content: 'Hello' }]);
  • 服务端返回的消息 ID 必须与客户端生成逻辑隔离——DeepSeek 不返回 message id,所以全由前端控制

部署时遇到 504 Gateway Timeout 怎么调

Vercel 默认 Serverless Function 超时是 10 秒,而 DeepSeek 的长回复可能超时,尤其开启 stream: false 时。错误现象是 UI 卡住、Network 面板显示 pending 后变 504。

实操建议:

  • Route Handler 中加 runtime: 'nodejs' 并设 maxDuration: 60(Vercel Pro 以上支持)
  • 强制启用流式:stream: true + 客户端用 response.body.getReader() 分块处理,避免等待整条响应
  • 在 route.ts 的 fetch 里加 signal 透传超时控制:fetch(url, { signal: AbortSignal.timeout(55_000) })
  • 本地开发用 next dev 不受此限,但上线前务必在 Vercel Dashboard 的 Functions 设置里确认 timeout 值

流式解析的边界情况最易出错:比如 DeepSeek 返回的 event: done 不标准、或中间夹杂空行。别依赖 event 类型字段,老实用正则匹配 ^data:\s*(\{.*\})$ 更稳。

大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!

相关专题

更多
Playwright 测试失败怎么办
Playwright 测试失败怎么办

Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。

2026.10.21

0

15

Playwright 页面操作指南
Playwright 页面操作指南

Playwright页面操作专题汇集元素定位、点击与输入、等待响应、多页面切换、Iframe、事件监听及文件处理的已审核文章,便于按操作场景查阅示例与常见问题。

2026.10.21

0

16

Playwright 入门教程
Playwright 入门教程

Playwright入门专题汇集测试框架安装、VS Code配置、录制脚本、编写首个用例、运行调试及查看报告的已审核文章,帮助初学者搭建端到端测试流程。

2026.10.21

0

16

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

2026.10.16

100

10

OpenJDK怎么配置Java开发环境
OpenJDK怎么配置Java开发环境

怎样用OpenJDK搭建开发环境?本专题介绍版本选择、下载安装、环境变量配置和编译运行验证,帮助你理清JDK的作用及基本配置流程,并通过简单程序检查环境是否可用,为后续项目开发做好准备。

2026.10.16

80

10

OpenJDK怎么部署Java应用
OpenJDK怎么部署Java应用

Java项目开发完成后,怎样部署到目标环境并正常运行?本专题介绍OpenJDK应用部署流程,涵盖运行环境准备、版本兼容检查、应用打包、启动参数配置和日志查看,帮助你理清部署前后的操作顺序,减少环境差异造成的运行问题。

2026.10.16

40

10

Revel框架模板渲染与表单验证
Revel框架模板渲染与表单验证

本专题围绕Revel框架视图层开发,介绍模板语法、变量输出、布局复用、表单提交、参数绑定与验证规则,帮助开发者完成安全规范的页面交互。

2026.10.16

40

15

Revel框架MVC路由与控制器
Revel框架MVC路由与控制器

本专题聚焦Revel框架MVC核心机制,讲解路由定义、控制器Action、参数绑定、请求响应和反向路由,并结合常见场景梳理接口请求处理流程。

2026.10.16

20

15

Revel框架入门与安装配置
Revel框架入门与安装配置

本专题从Revel框架环境搭建讲起,系统介绍命令行工具安装、项目创建、目录结构、配置文件及热代码重载,帮助开发者快速完成首个Go Web应用。

2026.10.16

40

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
腾讯元宝使用手册
腾讯元宝使用手册

共0课时 | 0人学习

DeepSeek手册
DeepSeek手册

共0课时 | 0人学习