react与nodejs实现流式传输,并可以进行中断(fetch聊天版)

server/2025/1/13 9:20:21/

一、前端
1.首先我们直观流的接收,后面再来流的中断

    // 创建一个新的 AbortControllerconst controller = new AbortController();setAbortController(controller); // 保存控制器以便之后使用const responseStream: any = await fetch("你的后端地址url",{method: "POST", // 请求方法headers: {"Content-Type": "application/json", // 根据需要设置其他头部Authorization: `Bearer ${localStorage.getItem("accessToken")}`, // 携带 token},body: JSON.stringify(content), // 将复杂的参数对象转换为 JSON 字符串signal: controller.signal, // 将取消信号传递给请求});

2. 其中signal为前端客户端中断流连接请求的信号
3.判断流是否ok

 if (!responseStream.ok) {throw new Error("Network response was not ok");}

4.创建流的接收

 const reader = responseStream.body.getReader();const decoder = new TextDecoder();let done = false;//流是否接收完的标志let result = "";//拼接流

5.流的循环展示

 while (!done) {     // 持续读取流数据,直到完成const { value, done: readerDone } = await reader.read();done = readerDone;doneRef.current = done;//后面要用到中断流请求的参数result += decoder.decode(value, { stream: true });//此处之后可以进行你需要的逻辑操作//result 是一个流传输的数据,会不断接收后端传过来的数据}

6.如果想要实现流传输的中断

const stopStream = () => {doneRef.current = true;if (abortController) {abortController.abort(); // 取消请求doneRef.current = true;}};

7.先在你要中断流的函数中编辑 其中 abortController为你创建流式的中断器 即

    const controller = new AbortController();

      setAbortController(controller); // 保存控制器以便之后使用

8.在react中 abortController

  const [abortController, setAbortController]: any = useState(null);

二、后端

 1.设置响应头

// 设置响应头,支持流式传输res.setHeader("Content-Type", "text/event-stream");res.setHeader("Transfer-Encoding", "chunked");

2.监听客户端中断请求

 

  let isRequestAborted = false;// 监听客户端中断请求res.on("close", () => {if (!res.writableFinished) {console.log("客户端中断了请求");isRequestAborted = true;res.end();}});

3.创造流式

// 调用流式 APIconst stream = await openai.chat.completions.create({messages: AllChatList,model: "xxxxxxxxx",stream: true, // 启用流式响应});

 4.发送数据

 let aiResponse = ""; // 用于存储完整的 AI 响应let IsStop = 0;// 逐块发送数据给前端for await (const chunk of stream) {if (isRequestAborted) {// 如果客户端中断了请求,停止发送数据console.log("请求已中断,停止流式传输");IsStop = 1;break;}const content = chunk.choices[0]?.delta?.content || "";aiResponse += content; // 逐步收集 AI 的响应内容res.write(content); // 将数据块发送给前端}// 结束响应res.end();

 

 


http://www.ppmy.cn/server/157974.html

相关文章

使用RSyslog将Nginx Access Log写入Kafka

个人博客地址:使用RSyslog将Nginx Access Log写入Kafka | 一张假钞的真实世界 环境说明 CentOS Linux release 7.3.1611kafka_2.12-0.10.2.2nginx/1.12.2rsyslog-8.24.0-34.el7.x86_64.rpm 创建测试Topic $ ./kafka-topics.sh --zookeeper 192.168.72.25:2181/k…

多个表单使用相同的 ref 和 rules,表单验证规则不生效

在 Vue 和 Element UI 中,如果多个表单使用相同的 ref 和 rules,可能会导致表单验证规则不生效。这是因为 ref 是唯一的,多个表单共享同一个 ref 会导致冲突。 解决方法: 1. 为每个表单设置不同的 ref 为每个表单设置不同的 re…

python在excel表某一列之后插入六列并命名名字

要在 Python 中使用 openpyxl 包在 Excel 表的某一列之后插入六列并命名这些新列,可以按照以下步骤进行操作。这包括加载 Excel 文件、插入新列,并为新列添加标题名称。 安装 openpyxl 确保已经安装 openpyxl 如果还没有安装,可以使用以下命…

【微服务】8、分布式事务 ( XA 和 AT )

文章目录 利用Seata解决分布式事务问题(XA模式)AT模式1. AT模式原理引入2. AT模式执行流程与XA模式对比3. AT模式性能优势及潜在问题4. AT模式数据一致性解决方案5. AT模式一阶段操作总结6. AT模式二阶段操作分析7. AT模式整体特点8. AT模式与XA模式对比…

SpringBoot 使用 Cache 集成 Redis做缓存保姆教程

1. 项目背景 Spring Cache是Spring框架提供的一个缓存抽象层,它简化了缓存的使用和管理。Spring Cache默认使用服务器内存,并无法控制缓存时长,查找缓存中的数据比较麻烦。 因此Spring Cache支持将缓存数据集成到各种缓存中间件中。本文已常…

LeetCode100之单词搜索(79)--Java

1.问题描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那…

piexl 手机刷装机包,以及使用面具root手机

刷机 1 下载官方的factory完整包 https://developers.google.cn/android/images?hl=zh-cn#taimen 2 选择版本下载(factory完整包,指定手机型号,选择系统) -taimen-rp1a.201005.004.a1-factory-2f5c4987.zip3 解压, win机器线刷执行脚本flash-all.bat bootloader-taimen…

HTML 闪烁动画(Blink Animation)

HTML 闪烁动画(Blink Animation) 闪烁动画是一种动态效果,使元素周期性地显现和消失,常用于吸引用户注意。以下是如何使用 CSS 和 HTML 创建闪烁动画的详细说明。 1. 基本概念 闪烁动画:通过改变元素的透明度来实现…