【解决问题方法论】缩小范围

本文解决了一个Node.js服务器上压缩文件下载时损坏的问题,通过排查文件读取方式和压缩过程,最终发现压缩方法未等待压缩完成即响应客户端,导致下载的压缩包不完整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

摘要: 在一个工程中,程序中某个功能运行与预期结果不一样。导致这个问题的发生有很多因素,有时候很难定位是哪些因素导致这个问题的发生 。所以我们需要不断缩小范围,最终找出问题所在

问题描述

在Node服务器上调用接口压缩文件,压缩包下载下来是损坏状态,但在服务器上是正常的
在这里插入图片描述

排查问题

  1. 先看看压缩包本身是不是正常。我们打开服务器上的压缩包,发现是正常,也就是调用接口->客户机过程的问题

  2. 看压缩文件与返回文件的三行代码
    在这里插入图片描述 ctx.response.set('Content-Disposition','attachment;filename=log.zip') 设置http头部,它会激活浏览器文件下载对话框,它的文件名框自动填充了filename。所以先排除这个

  3. 文件读取方式
    fs.readFileSync("log.zip") 读取文件。在Node中还有其他的方法读取文件,我们拿来试试,看看是不是文件读取的方式问题。
    fs.ReadStream("log.zip") 不行
    fs.createReadStream("log.zip") 不行
    所以也排除这个

  4. 压缩过程,也是最后一个了
    这里我们不知道压缩方法是怎么个流程,所以去看看compressing的文档
    在这里插入图片描述
    从文档看到,compressDir 方法是异步返回的,它不会等到压缩完成才运行ctx.response.body响应客户端,所以最终结果是响应客户端的是一个还没完成压缩的压缩包。最后改成这样就可以了

app.use(async ctx => {
  if (ctx.request.url == "/zip") {
    await compressing.zip.compressDir("log","log.zip")
    ctx.response.set('Content-Disposition','attachment;filename=log.zip') 
    ctx.response.body = fs.createReadStream("log.zip")
  }
});

参考资料

《调试九法——软硬件错误的排查之道》

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值