晚上继续折腾我那用 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
格式,以及生成多尺寸的缩略图,这样图片处理的逻辑就能单独从小窝主体业务里面抽离出来了,想更换尺寸提供给前端使用,也能更加得心应手。