是否可以在 Axios 中发布 responseType: 'stream' ?

Tor*_*orc 5 javascript stream reactjs axios

我正在尝试编辑 Axios 的一个实例,以便响应类型应该是一个'stream'而不是标准的 JSON。

从关于 SO 的其他帖子中,我似乎不清楚如何实现这一点。

这是绝路吗??

我当前的 Axios 实例:

import axios from 'axios';
import { URL } from '../urls';
import {
  requestHandler,
  successHandler,
  errorHandler,
} from './Handlers';

const Api = axios.create({
  baseURL: `${URL}`,
  withCredentials: true,
});

Api.interceptors.request.use((request) => requestHandler(request));
Api.interceptors.response.use((response) => successHandler(response), (error) => errorHandler(error));

export default Api;
Run Code Online (Sandbox Code Playgroud)

实施的 :

const query = {"selections":{"TABLE_A":["COLUMN1"]},"filters":[{"predicates":[]}],"joins":[],"sorts":[],"limit":100,"offset":0}
const response = await Api.post('/data', query);
Run Code Online (Sandbox Code Playgroud)

axios帖子的签名如下所示:
axios.post(url[, data[, config]])
示例 1
示例 2

此签名似乎并不表示新创建的实例axios具有与流相关的属性。理想情况下,我将能够做这样的事情:

const response = await Api.post(URL, responseType: 'stream', query);
Run Code Online (Sandbox Code Playgroud)

或可能:

const response = await Api(responseType: 'stream').post(URL, query);
Run Code Online (Sandbox Code Playgroud)

Tor*_*orc 12

'stream'虽然似乎可以指定这样的responseType :

const response = await Api({
    url: '/data',
    method: 'POST',
    responseType: 'stream',
    data: query
}); 
Run Code Online (Sandbox Code Playgroud)

Axios 的xhr.js文件将在浏览器中抛出此警告:

提供的值“stream”不是 XMLHttpRequestResponseType 类型的有效枚举值。

进一步深入研究文档:
Axios 请求配置表明这'stream'是可以接受的responseType。具体来说,如果您查看以下内容axios/index.d.ts

export type ResponseType = 
  | 'arraybuffer' 
  | 'blob' 
  | 'document' 
  | 'json' 
  | 'text' 
  | 'stream' 
Run Code Online (Sandbox Code Playgroud)

但是, XMLHttpRequest的 WHATWG 规范显示该'stream'规范无效:

enum XMLHttpRequestResponseType {
  "",
  "arraybuffer",
  "blob",
  "document",
  "json",
  "text"
};
Run Code Online (Sandbox Code Playgroud)

问题是 Axios 在从客户端/浏览器中发出请求时使用 XhrAdapter。如果axios在服务器端,就会使用HttpAdapter。XhrAdapter 需要生成XMLHttpRequest,但服务器可以生成 HttpRequest,因此有大量关于使用 Axios 在 Node 中处理流的帖子,因为 Node 是后端解决方案。

似乎无法在客户端使用 Axios 传输结果。fetch()可能是唯一的选择。