那些年,在nodejs上踩过的坑
来源:互联网 发布:中原工学院软件怎么样? 编辑:程序博客网 时间:2024/04/27 16:46
原文:http://cnodejs.org/topic/4fc7789a8be5d070121141cd
-----------------------------------------------------------
自己写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]
这在一个大项目绝对是坑爹了,排错都需要很久。
ps:之前的描述存在问题,谢谢苏千的指正。
2. buffer
还是老规矩,先看代码:
var data = ""; res.on('data', function (chunk) { data += chunk; }) .on("end", function () { });
这段代码在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得优势就在于异步,硬生生要做成同步绝对吃力不讨好
- 那些年,在nodejs上踩过的坑
- 那些年,在nodejs上踩过的坑(一)
- 那些年在WebView上踩过的坑
- 那些年在WebView上踩过的坑
- 那些年在WebView上踩过的坑
- 那些年在WebView上踩过的坑
- 那些年我们在spark SQL上踩过的坑
- android之那些年在微支付上踩过的坑!
- 那些年在Android之路上踩过的坑
- 那些年…上过的女孩
- 那些年我踩过的坑
- 那些年Dialog踩过的坑
- 那些年踩过的坑
- 那些年踩过的坑
- 那些年,踩过的坑
- 那些年,React 踩过的坑
- 那些年在Opencv遇到过的Mat坑
- 那些年我们一起上过的黑客网站
- 笔试题53. LeetCode OJ (40)
- HandlerInterceptorAdapter
- fedoraXX 下载镜像地址
- oldlinux 新老论坛索引对照表
- hdu 1241 Oil Deposits(DFS)
- 那些年,在nodejs上踩过的坑
- 八大排序之冒泡排序
- php 页面每隔一秒输出一次时间
- 关于OpenWRT编译的一些Mark
- Enable Bootcamp to install Windows from usb for MAC
- Unity3D协同程序(Coroutine)
- 详解Gson使用(三)使用注解
- Android中的普通对话框、单选对话框、多选对话框、带Icon的对话框、以及自定义Adapter和自定义View对话框详解
- 剑指offer之面试题45圆圈中最后剩下的数字