首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过管道将axios请求发送到pkgcloud存储上传会导致“结束后写入”错误

通过管道将axios请求发送到pkgcloud存储上传会导致“结束后写入”错误
EN

Stack Overflow用户
提问于 2019-06-04 12:20:34
回答 2查看 2.8K关注 0票数 2

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

代码语言:javascript
复制
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");
})()

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

代码语言:javascript
复制
Download finished
Upload finished
Promise resolved
Upload error
Error: write after end
...
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-06 13:22:26

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

代码语言:javascript
复制
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")
票数 3
EN

Stack Overflow用户

发布于 2020-03-21 20:09:58

这个问题来自于pkgcloud中的一个bug,它是如何为OpenStack存储流式传输文件的。它在https://stackoverflow.com/a/60787524/4685491中有解释

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56437297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档