继续完善我的轻缓存服务

2023-04-17

晚上继续折腾我那用 nodeJS 的轻缓存服务,打算从原先执行 wget 获取图片文件的方式,切换到 nodeJS 原始的 https 库来实现,获取到文件之后再通过 writeFileSync 函数写入磁盘,并同时返回二进制内容给浏览器。

由于代码是科技 ChatGPT 生成的,难免会有一些问题。期间遇到了首次获取图片返回浏览器时出现白色方块的情况,感觉是获取到的 Buffer 有问题,但一直没找出原因,后续参考了 StackOverflow 的一些帖子,逐一尝试把我一段代码 res.setEncoding("binary") 删了就成功解决了问题,这段代码看上去是设置返回内容的格式,为啥去掉反而正常了呢?

https.get(imgUrl, (res) => {
  const { statusCode } = res;

  if (statusCode !== 200) {
    console.error(`图片获取失败,状态码: ${statusCode}`);
    reject(new Error(`Status code err: ${statusCode}`))
  }

  // ! 这里需要去掉,否则传给浏览器就会出现小方块
  // res.setEncoding("binary");
  let data: any[] = [];

  res.on("data", (chunk) => {
    data.push(chunk);
  });

  res.on("end", () => {
    resolve([Buffer.concat(data), res.headers]);
  });
}).on("error", (err) => {
  console.error(`请求图片时发生错误: ${err.message}`);
  reject(new Error(`Get file err: ${err.message}`));
});

...

ctx.body = buffer;

再进一步完善好的话,我希望可以直接转换成 webp 格式,以及生成多尺寸的缩略图,这样图片处理的逻辑就能单独从小窝主体业务里面抽离出来了,想更换尺寸提供给前端使用,也能更加得心应手。

多云 一般
概览页 时间轴
奇趣音乐盒 技术源于 Kico Player
Emmm,这里是歌词君