我有一个代理服务器,需要在外部API服务器上提出一个请求,从一些文本合成语音. 在API文档中,有一句话告诉我:请求之后,我会得到第一个带有头的响应,之后我会得到流模式的二进制数据,因为响应的主体中有'Transfer—Encoding:chuned'.

所以,我用responseType: 'stream'做这个东西和这个代码

export const synthesizeVoice = async (contentType: ContentType,
                                      dataForSynthesize: string,
                                      format: string = 'wav16', 
                                      voice:  string = 'Nec_24000') => {
    const token = await authHandler.getAuthData();
    const date  = new Date(); const timestamp = date.getTime();
    const file  = fs.createWriteStream(timestamp + '.wav'); // I'm storing getted data on server, so this one needed for that
    
    const response = await axios({
        method: 'POST',
        url: SAPI.SS_SYNTH,

        headers: {
            Authorization:  'Bearer ' + token,
            'Content-Type': (contentType === 'ssml') ? 'application/ssml' : 'application/text',
        },
        params: {
            format: format,
            voice:  voice,
        },
        data: dataForSynthesize,

        responseType: 'stream',
    });
    
    // I'm writting getted data to a file 
    response.data.pipe(file);
    // and return a path on method above in call stack to return getted binary data on front
    return file.path;
};

我的主要问题,在得到响应的第一块(如果我没有弄错)我的方法返回文件的路径(在那一刻文件不是完整的形式)和前面来不是完整的音频文件.

我怎么能等待得到完整的二进制数据并在那之后才发送他们的数据,或者我应该使用来self 的前端的流请求来按块获得数据?

还有,也许这种方式不好,我应该用别的东西?

UPD: Working code

axios({
    // nothing to changes here, I've just hidden it to short code example
})
.then(resp => {
    // Event listeners on files didn't working in my case, so
    // I used it with axios response 
    resp.data.pipe(file);

    resp.data.on('end', () => {
        file.close();

        res.set({
            'Content-Type': 'audio/wav16',
        });
        const resFile = fs.createReadStream(file.path).pipe(res);
    });
})
.catch(err => {
    console.log(err.message)
});

推荐答案

您可以try 以这种方式使用数据.

file.on('data', chunk => {
  console.log(chunk.toString());
});

若要在数据流结束后执行某些操作,可以使用

file.on('end', chunk => {
  console.log("End");
});

结合这两个我认为你将能够等待并获得完整的文件.

Typescript相关问答推荐

如何使打包和拆包功能通用?

类型断言添加到类型而不是替换

需要使用相同组件重新加载路由变更数据—React TSX

SortKey类型不起作用,尽管它使用的单个类型工作正常<>'

在Angular中注入多个BrowserModules,但在我的代码中只有一个

部分类型化非 struct 化对象参数

使用动态主体初始化变量

TypeScrip-将<;A、B、C和>之一转换为联合A|B|C

如何消除在Next.js中使用Reaction上下文的延迟?

将带点的对象键重新映射为具有保留值类型的嵌套对象

如何以Angular 导入其他组件S配置文件

->;Boolean类型的键不能分配给类型Never

在Google授权后由客户端接收令牌

如何键入对象转换器

递归类型别名的Typescript 使用

有没有一种方法可以提升对象的泛型级别,而对象的值是泛型函数?

有没有一种方法可以防止我的组件包在其中安装样式组件'; node 模块中的s目录

Angular 16:无法覆盖;baseUrl;在tsconfig.app.json中

为什么 Typescript 无法正确推断数组元素的类型?

当受其他参数限制时,通用参数类型不会缩小