Node.js的那些坑(一)——多进程中图片下载有时为0字节

时间:2022-07-14 16:41:51


最近由于工作需要重新开始使用Node.js,发现和几年前比强大了不少,同时也发现了不少坑。

在同事们的帮助下解决了一些(在此表示感谢)。

本系列博客积累并总结这些问题,与君共勉。



有问题的写法:

首先,一开始用到了request对象的pipe方法。但当下面这段代码出现在子线程当中(cluster.isWorker分支当中)时,下载的图片有时会变成0字节。

var request = require('request');
 
var imgUrl = "http://www.duzixi.com/img/logo_zixi.png";
var imgPath = file.imgPath(imgUrl);request(imgUrl).pipe(fs.createWriteStream(imgPath));

其中,file.imgPath是一个根据URL路径获取本地存储图片路径的方法。定义在file.js中。

file.js

let _imgPath = (imgUrl) => {
var localPath = path_release + "assets/texture/";
var i = imgUrl.lastIndexOf("/");
var j = imgUrl.lastIndexOf('.');
var str = imgUrl.substr(j + 1);
return localPath;
}
exports.imgPath = _imgPath;

以上源代码中的path_release读自本地Config.json文件,是当前程序运行的路径。图片会下载在其下的assets目录下的texture目录中。


问题的解决方案:

问题的解决方案是,改变下载的方式。同时将图片下载方法封装在file.js中,代码如下:

file.js

exports.getImage = (imgUrl) => {
return new Promise(resolve => {
var imgPath = _imgPath(imgUrl);
request({
url: imgUrl,
encoding:null
}, (err, response, body) => {
fs.writeFileSync(
imgPath,
body,
{
encoding:'binary'
}
)
resolve()
})
})
}


放弃pipe方法,而直接改用成request下载的方式。

至于为什么这样做会成功,我也解释不清楚(望高人指点),但原先图片下载有时为0字节的问题确实解决了。