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

最近由于工作需要重新开始使用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字节的问题确实解决了。

    原文作者:子兮、
    原文地址: https://blog.csdn.net/lotusiki/article/details/53841162
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞