LIo冰醋酸 2023-03-08 11:59 采纳率: 0%
浏览 620

axios该如何读取流中的数据

原本的需求是,后端返回一个流,并向流中传送数据,前端将后端向流中传送的数据一点一点读出来
后端代码如下

 @PostMapping("/streaming-text")
    public StreamingResponseBody stream() {
        return out -> {
            for (int i = 0; i < 10; i++) {
                out.write(("Message " + i + "\n").getBytes());
                out.flush();
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
    }

前端请求如下

      axios.post('http://localhost:8080/streaming-text', {
        // specify the response type as stream
        responseType: 'stream'
      })
        .then(response => {
          const stream = response.data
          stream.on('data', chunk => {
            console.log(new TextDecoder().decode(chunk))
          })
          stream.on('end', () => {
            console.log('Stream ended')
          })
        })
        .catch(error => {
          console.error(error)
        })

结果报错

TypeError: stream.on is not a function

说stream.on不是一个方法,用fetch就可以顺利读取出来,但是axios就不行,请问该如何使用axios完成

  • 写回答

3条回答 默认 最新

  • lide1992 2023-03-08 13:22
    关注

    使用axios来处理流数据需要在请求中设置responseType为stream,并且在响应拦截器中处理流数据。下面是一个示例代码,可以使用axios请求后端流数据并将其一点一点地输出到控制台:

    import axios from 'axios';
    import { Readable } from 'stream';
    
    axios.post('/streaming-text', null, {
      responseType: 'stream'
    }).then(response => {
      let reader = response.data.getReader();
      let decoder = new TextDecoder('utf-8');
    
      let readChunk = function() {
        reader.read().then(function(result) {
          if (result.done) {
            console.log('Stream complete');
            return;
          }
    
          console.log(decoder.decode(result.value));
          readChunk();
        });
      };
    
      readChunk();
    }).catch(error => {
      console.error('Stream request failed', error);
    });
    
    

    在这个示例中,我们使用axios对象来请求后端的流数据,并设置responseType为stream以表示响应为流数据。在响应拦截器中,我们使用ReadableStream对象的getReader()方法获取到一个ReadableStreamDefaultReader对象的reader,并使用TextDecoder对象将二进制数据解码为UTF-8字符串。在读取流数据的过程中,我们递归调用readChunk()函数来一点一点地读取数据,直到数据读取完成为止。

    评论

报告相同问题?

问题事件

  • 修改了问题 3月8日
  • 创建了问题 3月8日

悬赏问题

  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看