我正在使用 axios post 方法从远程服务器下载文件,然后保存到磁盘。 将文件保存到磁盘后,我需要将其发送到客户端作为响应。
let response = await axios.post(url, body, {headers :headers, responseType:'stream'})
let filePath = "reports/" + response.headers['content-disposition'].split("filename=")[1].replace(/"/g, "");
await response.data.pipe(fs.createWriteStream(filePath))
res.download(filePath);
我面临的问题是,当文件写入仍在进行时,会发送响应。 如果有其他选择,请建议。
编辑:- 问题出在写入流上。
溶液:-
let response = await axios.post(url, body, {headers :headers, responseType:'stream'});
let filePath = "reports/" + response.headers['content-disposition'].split("filename=")[1].replace(/"/g, "");
let ws = fs.createWriteStream(filePath);
new Promise((resolve, reject) => {
ws.on('open', () => {
response.data.pipe(ws);
}).on('error', function (err) {
reject(res.send({error: "message"}));
}).on('finish', function () {
ws.end();
resolve(res.download(filePath));
});
});
链接:- fs.createWriteStream 不会立即创建文件?
我认为你应该使用Promise.All来解决所有承诺,然后再继续。
据我所知,response.data.pipe不是一个承诺,所以await不会起作用。 尝试:-
response.data.pipe(fs.createWriteStream(filePath), {end: false})
response.data.on('end', ()=> res.download(filePath))