当前位置: 首页 > news >正文

axios设置 responseType为 “stream“流式获取后端数据

使用前景:

工作过程中遇到了后端接口响应过慢,前端界面一致loading的情况,这个时候可以尝试采用将Axios的responseType参数被设置为'stream'类型实现。

stream介绍:

stream类型意味着你希望服务器响应的数据以Node.js流(stream)的形式返回,而不是作为JSON、文本或其他类型的响应体。使用它的好处是可以避免一次性加载整个响应体,避免页面一直无响应,同时stream在处理大文件、实时数据传输或需要直接操作数据流的场景中非常有用。

使用:

axios+stream

const axios = require('axios');  axios({  method: 'post',  url: 'YOUR_STREAM_ENDPOINT_URL', // 替换为你的流式接口URL  responseType: 'stream',data: {}
})  
.then(response => {  // 这里的response.data是一个Node.js的流(Stream)对象  response.data.on("data", (chunk) => {console.log(chunk, "data");// 处理每个数据块,例如写入文件或进行其他操作});response.data.on("end", (end) => {console.log(end, "end");// 数据接收完毕的处理逻辑});response.data.on("error", (error) => {// 流处理过程中发生错误的处理逻辑});  
});

这个方法和网上搜索出来的大多数流式接口方法一致,但是在axios中设置responseType为 "stream"后,控制台会警告:

The provided value 'stream' is not a valid enum value of type XMLHttpRequestResponseType.

因为axios基于XMLHttpRequest原生,而XMLHttpRequest原生不直接支持responseType: 'stream'这个值。

fetch+stream

曲线救国的方法可以使用fetch来发送请求:

try{// 发送请求let response = await fetch("",{method: "post",responseType: "stream",headers: {Authorization: "Bearer " + 'token',"Content-Type": "application/json",},body: {},});// ok字段判断是否成功获取到数据流if (!response.ok) {throw new Error("Network response was not ok");}// 用来获取一个可读的流的读取器(Reader)以流的方式处理响应体数据const reader = response.body.getReader();// 将流中的字节数据解码为文本字符串const textDecoder = new TextDecoder();let result = true;let sqlValue = ''while (result) {// done表示流是否已经完成读取  value包含读取到的数据块const { done, value } = await reader.read();if (done) {result = false;break;}// 拿到的value就是后端分段返回的数据,大多是以data:开头的字符串// 需要通过decode方法处理数据块,例如转换为文本或进行其他操作const chunkText = textDecoder.decode(value).split("\n").forEach((val) => {if (!val) return;try {let text = val.data.result;console.log(val, text, "输出分段返回的数据");sqlValue += text;} catch (err) {}});}console.log(sqlValue,'输出所有返回数据')
} catch(err) {}

相关文章:

  • Docker 中运行的 MySQL 数据库与 Docker 外部的管理系统连接
  • blender
  • springboot 3 oauth2认证this.authorizationService.save(authorization)生成token报错异常
  • 常见汇编指令
  • 【数据结构】排序——插入排序,选择排序
  • [Cloud Networking] Layer 2
  • NineData云原生智能数据管理平台新功能发布|2024年5月版
  • 联合体和枚举<C语言>
  • 卡尔曼滤波器例子
  • MathType7.8永久破解版下载 让数学学习变得简单有趣!
  • 为什么Kubernetes(K8S)弃用Docker:深度解析与未来展望
  • 微信小程序学习笔记(4)
  • 【AI 高效问答系统】机器阅读理解实战内容
  • Vue3+TS 开发 Google 浏览器插件模板
  • 计算机网络 —— 网络层 (路由协议)
  • 分享一款快速APP功能测试工具
  • [译]前端离线指南(上)
  • cookie和session
  • JS函数式编程 数组部分风格 ES6版
  • linux学习笔记
  • nginx 负载服务器优化
  • PHP 的 SAPI 是个什么东西
  • vue学习系列(二)vue-cli
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 飞驰在Mesos的涡轮引擎上
  • 基于axios的vue插件,让http请求更简单
  • 免费小说阅读小程序
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 数据科学 第 3 章 11 字符串处理
  • 新手搭建网站的主要流程
  • 用jQuery怎么做到前后端分离
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • #1014 : Trie树
  • $(this) 和 this 关键字在 jQuery 中有何不同?
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (C语言)球球大作战
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (二)正点原子I.MX6ULL u-boot移植
  • (函数)颠倒字符串顺序(C语言)
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .gitignore文件—git忽略文件
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .net经典笔试题
  • .NET中使用Protobuffer 实现序列化和反序列化
  • @ModelAttribute使用详解
  • @NestedConfigurationProperty 注解用法
  • @RunWith注解作用
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [2018-01-08] Python强化周的第一天
  • [Angular] 笔记 7:模块