温馨提示:本文翻译自stackoverflow.com,查看原文请点击:javascript - Is it possible to POST a responseType: 'stream' in Axios?
axios javascript reactjs stream

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

发布于 2020-04-15 23:39:59

我想编辑Axios的实例,以便响应类型应该是'stream'标准JSON而不是标准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;

已实施:

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]])
示例1
示例2

这个签名似乎并不表示新创建的实例axios具有与流相关的属性。理想情况下,我将能够执行以下操作:

const response = await Api.post(URL, responseType: 'stream', query);

或潜在地:

const response = await Api(responseType: 'stream').post(URL, query);

查看更多

提问者
Joe H
被浏览
384
Joe H 2020-02-05 00:53

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

      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请求配置表明这'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,而服务器可以发出HttpRequests,因此有大量关于使用Axios处理Node中的流的文章,因为Node是一个后端解决方案。

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