我正在尝试编辑Axios的实例,以便响应类型应为'stream'
而不是标准JSON。
从S.O.上的其他帖子看来,我不清楚如何做到这一点。
这是死胡同吗?
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;
const query = {"selections":{"TABLE_A":["COLUMN1"]},"filters":[{"predicates":[]}],"joins":[],"sorts":[],"limit":100,"offset":0}
const response = await Api.post('/data', query);
帖子的axios
签名看起来像这样:axios.post(url[, data[, config]])
Example 1Example 2
此签名似乎并不表示axios
的新创建实例具有与流相关的属性。理想情况下,我可以执行以下操作:
const response = await Api.post(URL, responseType: 'stream', query);
或可能是:
const response = await Api(responseType: 'stream').post(URL, query);
虽然似乎可以这样指定'stream'
的responseType:
const response = await Api({
url: '/data',
method: 'POST',
responseType: 'stream',
data: query
});
Axios的xhr.js
文件将在浏览器中引发此警告:
The provided value 'stream' is not a valid enum value of type XMLHttpRequestResponseType.
深入研究文档:Axios Request Configuration表示'stream'
是可接受的responseType
。具体来说,如果您在axios/index.d.ts
中浏览:
export type ResponseType =
| 'arraybuffer'
| 'blob'
| 'document'
| 'json'
| 'text'
| 'stream'
但是,XMLHttpRequest的WHATWG规范显示'stream'
无效:
enum XMLHttpRequestResponseType {
"",
"arraybuffer",
"blob",
"document",
"json",
"text"
};
问题是当从客户端/在浏览器中发出请求时,Axios使用XhrAdapter。如果Axios在服务器端,则将使用HttpAdapter。 XhrAdapter将需要输入XMLHttpRequests,但是服务器可以进行HttpRequest,因此,由于Node是一个后端解决方案,因此存在大量有关使用Axios处理Node中的流的帖子。
似乎无法在客户端使用Axios流式传输结果。 fetch()
可能是唯一的选择。