设为首页 收藏本站
查看: 890|回复: 0

[经验分享] 那些年,在nodejs上踩过的坑(一)

[复制链接]

尚未签到

发表于 2017-2-22 12:43:16 | 显示全部楼层 |阅读模式
  自己写nodejs也有一段时间,踩过很多坑(而且大部分是自己给自己埋),也见过很多别人踩过的坑,原因其实也很简单,要么是对这个知识点理解不够深入,要么就是编码的习惯不好。这段响应朋春大牛的号召,打算陆陆续续整理下这些坑,算是给自己一个备忘,同时也希望能对大家有所帮助。
  1. callback
  事件回调是nodejs非常常见的一个应用场景,那大家先来看看以下这段代码是否存在什么问题?



get(params, function(err, data) {
if (err) {
callback(err);
}
//对data进行操作
var row = data[0];
});
  看出来了吧。对,就是err存在时,callback之后,接下来的代码还是要执行的。而这时,data值是什么,我们往往是没办法控制的。如果data这时返回的是undefined,那么就悲剧了,程序肯定报错。当然解决方法很简单,就是在callback之前加个return即可:



get(params, function(err, data) {
if (err) {
return callback(err);
}
//对data进行操作
var row = data[0];
});
  这个知识点并不是很难,但往往是初学者特别容易犯的错,甚至已经写了很久代码的同学也会偶尔犯这种低级错误。
  再来一个更隐蔽的:



db.get(key, function(err, data) {
if (err) {
return callback(err);
}
try {
callback(null, JSON.parse(data.toString()))
} catch(e) {
callback(e);
}
});
  看似没有任何问题吧。嘿嘿,揭晓答案, 对,被回调两次。callback(null, Error)一次,callback(e),具体比如:



function asyncfun(data, callback) {
try {
callback(null, JSON.parse(data.toString()));
} catch (e) {
callback(e);
}
}
var json = {'a': 'b'};
var jsonstr = JSON.stringify(json);
var d = new Buffer(jsonstr);
asyncfun(d, function(err, data) {
console.log(err);
throw new Error('new Error');
});
      运行结果:



null
[Error: new Error]
        这在一个大项目绝对是坑爹了,排错都需要很久。
  
  2. buffer
  还是老规矩,先看代码:



var data = "";  
res.on('data', function (chunk) {  
data += chunk;  
})  
.on("end", function () {  
//对data转码  
});
  这段代码在chunk都是ascii码数据或者数据量比较少时是没有问题,但如果你的数据是大量中文的话,恭喜你,中枪了,会出现乱码。其原因是两个chunk(Buffer对象)的拼接并不正常,相当于进行了buffer.toString() + buffer.toString()。如果buffer不是完整的,则toString出来后的string是存在问题的(比如一个中文字被截断)。具体可以参见朴灵写得这篇文章:http://cnodejs.org/topic/4faf65852e8fb5bc65113403
  3. 深度嵌套
  很多刚开始写nodejs代码的人,由于思路还停留在同步的思维,所以或多或少写过这样的代码:



func1(err, function(err1, data1) {
func2(err1, function(err2, data2) {
func3(err3, function(err3, data3) {
func4(err4, function(err4, data4) {
.......
})
})
})
})
  先别说这样的代码是否易于维护,光样子就够难看,代码都“斜”了。不怕大家耻笑,我自己刚开始就写时也写过这样“坑爹”的代码,为此自己当时还写了篇《如何让nodejs同步操作》讲如何解决这个问题。不过从源头上,大家还是要尽量避免采用这种同步的方法,因为nodejs得优势就在于异步,硬生生要做成同步绝对吃力不讨好

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-345781-1-1.html 上篇帖子: Nodejs中cluster模块的多进程共享数据问题 下篇帖子: 《NodeJS开发指南》第五章微博实例开发总结
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表