原文: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上踩过的坑相关推荐

  1. 那些年我们在spark SQL上踩过的坑

    做了一年延云YDB的开发,这一年在使用spark上真心踩了不少坑,总结一下,希望对大家有所帮助. spark 内存泄露 1.高并发情况下的内存泄露的具体表现 很遗憾,spark的设计架构并不是为了高并 ...

  2. 搭建风控系统道路上踩过的坑合集

    作者前言 从业近10年,大大小小参与了3家公司不同领域的风控系统的设计,从前到后把风控系统所有环节都细细的琢磨过,然而至今仍然感觉刚刚一只脚踏进门而已. 大多数人做的产品都是目的明确的,比如订单支付. ...

  3. flutter ios上踩的一个坑

    在ios模拟器上调试的时候出现错误信息:The iOS Simulator deployment target is set to 4.3... 原来是因为ios 版本问题,于是找到资料是在 Podf ...

  4. 在MongoDB的MapReduce上踩过的坑

    太久没动这里,目前人生处于一个新的开始.这次博客的内容很久前就想更新上来,但是一直没找到合适的时间点(哈哈,其实就是懒),主要内容集中在使用Mongodb时的一些隐蔽的MapReduce问题: 1.R ...

  5. soapui 乱码_在soapui上踩过的坑

    资料来自网络 1.新建一个DataSource,选择Excel(需要Excel2003格式),选择行号,设置起始行结束行,设置规则,trim等 2.在返回结果的outline中,可以直接选定一个记录进 ...

  6. OpenCV在Android上踩过的坑

    最近一个新项目需要用的到人脸检测,想着之前见过opencv,就在网上找了配置教程,结果一直无法成功,鉴于网上的基本都是330版本,想着可能比较老,去官网下载了最新版(那个下载速度啊,真的是-)建议可以 ...

  7. (转)Redis上踩过的一些坑-美团

    上上周和同事(龙哥)参加了360组织的互联网技术训练营第三期,美团网的DBA负责人侯军伟给大家介绍了美团网在redis上踩得一些坑,讲的都是干货和坑. 分为5个部分: 一.周期性出现connect t ...

  8. Redis上踩过的一些坑-美团

    上上周和同事(龙哥)参加了360组织的互联网技术训练营第三期,美团网的DBA负责人侯军伟给大家介绍了美团网在redis上踩得一些坑,讲的都是干货和坑. 分为5个部分: 一.周期性出现connect t ...

  9. 使用SmartUpload组件上传文件,自己踩过的坑

    昨天使用SmartUpload组件上传文件,代码很简单: smartupload_demo01.html <html> <head><title>smartuplo ...

最新文章

  1. linux下使用sort命令升序、降序、随机及组合方式排序方法
  2. 在matlab中可以计算式子的最大值吗,matlab求最大值
  3. 放上了一篇几个月前写的东西
  4. Linux执行命令unable to create new native thread问题
  5. 使用jMeter的csv data set config避免用户密码的硬编码
  6. 时间序列模式识别_空气质量传感器数据的时间序列模式识别
  7. 数据结构之排序算法:内部排序算法的应用与比较
  8. codeforces 385C Bear and Prime Numbers
  9. java servlet init方法_Java HttpServlet.init方法代码示例
  10. [设计模式-行为型]中介者模式(Mediator)
  11. 重拾web开发-DIV+CSS基础(总结)
  12. [译] What is some general advice for a new PhD student?
  13. php的登陆代码,PHP登陆页面完整代码
  14. java实现单例模式线程安全
  15. vue 源码学习总纲
  16. 考试大纲-青少年软件编程等级考试Scratch1-4级
  17. 系统架构师考试 2019
  18. VScode开发PHP的必要插件
  19. 微博的10大特征包括哪些?
  20. 2018年算法工程师薪酬报告出炉:平均年薪50.21万,点燃寒冬的一把火

热门文章

  1. JSP 编译原理:JSP 是 Servlet?如何用 Eclipse 查看 JSP 编译生成的 Servlet 源文件?
  2. Tomcat 服务:解决 Apache Tomcat 更新后 Tomcat9w.exe 无法启动 Tomcat 服务的问题
  3. Apache Hadoop 启动报错:masternode:ssh: connect to host master port 22: Connection timed out 总结
  4. 获取行信息_论文推荐 | 周乐韬,黄丁发,袁林果,等:基于状态和残差的北斗基准站观测数据表达与信息分级...
  5. Linux apt命令
  6. c++注释快捷键_Jupyter Notebook amp; Lab快捷键大全
  7. Linux namespace之:network namespace
  8. 高性能MySQL(4)——查询性能优化
  9. inux CentOS 7 修改内核启动默认顺序
  10. Dede 删除文档同时文章中的图片的方法