关于微信小程序onProgressUpdate中progress为null的问题

博主在实现Node.js后端下载文件接口时遇到微信小程序下载进度为null的问题,发现缺少Content-Length响应头导致。通过添加Content-Length解决了问题,并且为了避免大文件下载时的内存泄漏,优化了代码,利用stream的pause和resume方法控制数据流,确保了接口性能和稳定性。
摘要由CSDN通过智能技术生成

今天在做小程序作业时,因为后端用的node,在写一个下载文件的接口时,我是这样写的:

router.get("/bookFile", (req, res, next) => {
    const url = `books/${decodeURI(req.query.filename)}`
    const exist = fs.existsSync(url)
    
    if (exist) {
        res.set({
            "Content-type": "application/octet-stream",
            "Content-Disposition": "attachment;filename=" + encodeURI(req.query.filename)
        });
        fReadStream = fs.createReadStream(url);
        fReadStream.on("data", (chunk) => {
            res.write(chunk)
        });
        fReadStream.on("end", function () {
            res.end();
        });
    } else {
        res.set("Content-type", "text/html");
        res.send("file not exist!");
        res.end();
    }
})

然后在微信小程序这边调用wx.downloadFile接口返回一个downloadTask,再去调用wx.onProgressUpdate想去获取下载进度时,发现res.progress为null,我就奇了怪了,之前用别人的链接还可以获取啊,怎么自己写的接口就获取不到这个progress了,然后我去看了看响应报文:

再对比了一下别人的能正常获取到progress值的下载链接的响应报文:

在这里插入图片描述

发现比我自己写的多了一个关键的响应头:Content-Length,加上之后确实能正常获取到progress值了。

在摸索这个问题时,我看到了这篇文章 nodejs Stream 使用中的陷阱 ,发现我以上的写法还有一个问题,就是有可能在下载一些较大的文件时,可能会出现内存泄露的问题,对于以上的两个问题,我将原来的接口代码做了以下的优化:

router.get("/bookFile", (req, res, next) => {
    const url = `books/${decodeURI(req.query.filename)}`
    const stat = fs.statSync(url);
    const exist = fs.existsSync(url)
    
    if (exist) {
        res.set({
            "Content-type": "application/octet-stream",
            "Content-Disposition": "attachment;filename=" + encodeURI(req.query.filename),
            "Content-Length": stat.size
        });
        fReadStream = fs.createReadStream(url);
        fReadStream.on("data", (chunk) => {
            if (!res.write(chunk)) { //判断写缓冲区是否写满(node的官方文档有对write方法返回值的说明)
                fReadStream.pause(); //如果写缓冲区不可用,暂停读取数据
            }
        });
        fReadStream.on("end", function () {
            res.end();
        });
        res.on("drain", function () { //写缓冲区可用,会触发"drain"事件
            fReadStream.resume(); //重新启动读取数据
        });
    } else {
        res.set("Content-type", "text/html");
        res.send("file not exist!");
        res.end();
    }
})

原文:关于微信小程序onProgressUpdate中progress为null的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值