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字节的问题确实解决了。



  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值