gpt4 book ai didi

node.js - 通过管道将 axios 请求发送到 pkgcloud 存储上传会导致 "write after end"错误

转载 作者:太空宇宙 更新时间:2023-11-03 23:57:27 27 4
gpt4 key购买 nike

我正在尝试使用 axios 下载外部文件,然后使用 pkgcloud 将其通过管道传输到 openstack 对象存储容器中。上传流似乎在文件完全下载之前就结束了。

async function upload(url, name, extension, container) {
const uploadStream = storage.createClient({
...
}).upload({
container: container,
remote: name + "." + extension,
});

await new Promise(async (resolve) => {
const response = await axios({
method: "GET",
url: url,
responseType: "stream"
})

response.data.pipe(uploadStream)

response.data.on("end", () => {
console.log("Download finished");
})
response.data.on("error", (error: Error) => {
console.log("Download error")
console.log(error);
})
uploadStream.on("finish", () => {
console.log("Upload finished");
resolve();
})
uploadStream.on("error", (error: Error) => {
console.log("Upload error");
console.log(error);
})
})
}

const url = "https://picsum.photos/id/566/600/600";

(async () => {
await upload(url, "mountain", "jpg", "dummy_container")
console.log("Promise resolved");
})()

根据控制台输出的事件顺序如下:

Download finished
Upload finished
Promise resolved
Upload error
Error: write after end
...

最佳答案

可以通过使用 concat-stream 包将下载流式传输到缓冲区,然后将缓冲区流式传输到上传来解决此问题:

function upload(url, name, extension, container) {
const uploadStream = storage.createClient({
...
}).upload({
container,
remote: name + "." + extension,
});

axios({
method: "GET",
url,
responseType: "stream",
}).then((response) => {
const concatStream = concat((buffer) => {
const bufferStream = new Stream.PassThrough();
bufferStream.end(buffer);
bufferStream.pipe(uploadStream);
})
response.data.pipe(concatStream);
})
}

const url = "https://picsum.photos/id/566/600/600";
upload(url, "mountain", "jpg", "dummy_container")

关于node.js - 通过管道将 axios 请求发送到 pkgcloud 存储上传会导致 "write after end"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56437297/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com