迷新白的博客 迷新白的博客
首页
随笔
  • Vuepress
  • Springboot
  • 开发工具
  • 系统工具
读吧
  • 智能浇花系统 (opens new window)
  • 用户中心系统 (opens new window)
  • 关于
  • 友情链接
GitHub (opens new window)

迷新白

愿你平安
首页
随笔
  • Vuepress
  • Springboot
  • 开发工具
  • 系统工具
读吧
  • 智能浇花系统 (opens new window)
  • 用户中心系统 (opens new window)
  • 关于
  • 友情链接
GitHub (opens new window)
  • 用户中心系统

  • 仿Deepseek官网AI聊天网站

    • 需求分析
    • 首页&聊天页开发
    • 接入deepseek
    • 数据库搭建
    • 首页完善(前端)
    • 登陆系统-clerk
    • 首页完善(后端)
    • 保留上下文对话
      • 保存用户信息(后端)
      • 获取聊天接口
      • 获取消息接口
      • 测试
    • 第一次对话完善
  • 尤克里里音月-Flutter(需求分析阶段)

  • 项目
  • 仿Deepseek官网AI聊天网站
迷新白
2025-04-27
目录

保留上下文对话

# 08.保留上下文对话

这是摘要

# 保存用户信息(后端)

在src/app/api/chat/route.ts文件中 校验是否已经登录image-20250427203356043

存入用户信息image-20250427210557075

我们扩充了参数,需要在前端也添加上新增的参数

image-20250427210739969

useParams()是用于从 URL 中获取参数的钩子

使用useQuery创建一个post请求

# 获取聊天接口

新建src/app/api/get-chat/route.ts

import {unauthorized} from "next/navigation";
import {getChat} from "@/db";
import {auth} from "@clerk/nextjs/server";

export async function POST(req:Request){
    const {chat_id} = await req.json()

    //判断是否登录,登陆后方可读取
    const { userId } = await auth()
    if (!userId) {
        return new Response(JSON.stringify({error:unauthorized}),{
            status: 401,
        })
    }

    //返回chat
    const chat = await getChat(chat_id,userId)
    return new Response(JSON.stringify({chat}),{status: 200})
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

在聊天页src/app/chat/[chat_id]/page.tsx调用返回的参数

image-20250427205110143

# 获取消息接口

在src/app/chat/[chat_id]/page.tsx中定义返回消息的前端方法image-20250427213010120

在后端API中创建src/app/api/get-messages/route.ts

import {getMessagesByChatId} from "@/db";
import {auth} from "@clerk/nextjs/server";

export async function POST(req:Request){
    const {chat_id,chat_user_id} = await req.json()
    const { userId } = await auth()

    //判断是否已登录
    if (!userId || chat_user_id !== userId) {
        return new Response(JSON.stringify({error:'unauthorized'}),{
            status: 401,
        })
    }

    //返回message
    const messages = await getMessagesByChatId(chat_id);
    return new Response(JSON.stringify({messages}),{status: 200})
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

补充page页Message的入参image-20250427215333614

测试

image-20250427215105294

POST的地址不对

原因在于前端src/app/chat/[chat_id]/page.tsx的请求路径写的是相对路径

在 /chat/[chat_id] 页面下发起这个请求时

Next.js会基于当前路由路径解析这个相对路径,导致实际请求变成了 /chat/api/get-chat

在请求最开始添加/表示绝对路径(上上张图已更改)image-20250427220819957

再测试

image-20250427220908158

表示身份验证未通过

创建条件语句,测试一下是哪个问题

image-20250427221302212是第二个问题image-20250427221324614

比较两者的输出image-20250427221505747

是前一个变量没有被定义

找到问题了

image-20250427222103868

后端API实现里返回的数据多用了一个大括号

在 JavaScript 和 TypeScript 中,JSON.stringify 方法用于将一个对象或值转换为 JSON 字符串。在 JSON.stringify 中传递一个对象时,它会将该对象的所有可枚举属性序列化为 JSON 格式。

chat 是一个对象 例子

//没有加{}
{
  id: 5,
  userId: 'user_2wHxPcxxxxxxxxxxxxxx',
  title: '测试保存记录',
  model: 'deepseek-v3'
}
//加了{}
{"chat":{"id":"123","userId":"user123","messages":["Hello","World"]}}
1
2
3
4
5
6
7
8
9

会把结果包裹在一个额外的chat对象中,删去即可

image-20250427222700022

image-20250427222645718

# 测试

退出页面后,对话记录仍有保留

image-20250427222902608

在SupaBase中创建了对话记录image-20250427222958862

文字写于:广东

更新时间: 2025/4/27 23:24:07
首页完善(后端)
第一次对话完善

← 首页完善(后端) 第一次对话完善→

最近更新
01
第一次对话完善
04-27
02
首页完善(后端)
04-27
03
登陆系统-clerk
04-27
更多文章>
Theme by Vdoing | Copyright © 2022-2025 迷新白 | 的博客
sitemap icon by Icons8
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式