《Node.js实战》学习笔记

学习Node的起因是Bluemix在内部测试,但我对各种Web框架都不太熟悉,感觉Node比较热门,就买了这本书打算看。

Day 0:万事开头难

虽然买了书,却一直找不到看书的契机,直到在Startup News上面看到有人发布了某网站的泄露信息链接,于是有了做一个查询密码泄露信息网站的想法。

Talk is cheap,咱得来一个说做就做项目。首先从Bluemix新建一个Node.js应用,把代码下载到本地,发现用的是Express,然后发现这本书的第8章讲的是这个框架,于是直接从第8章开始啃。

连蒙带猜,一天时间居然就把功能实现了,其实页面只有一个输入框和一个提交按钮,后台我把数据一次全都读到内存,连数据库也没有。虽然还谈不上入门,但感觉有了学习的兴趣,所以决定从头看一遍这本书。

Day 1:玩物不丧志

另一个契机是最近刚买了一个机械键盘,爱不释手,但平时的使用量真是少啊,所以前面几章我都是手工输入代码的。运行到第49页的代码时发现一处错误:

client.on('connect', function() {
  channel.emit('join', id, client);
});

需要改为如下方可运行:

channel.emit('join', id, client);

当时猜想是因为这个client的‘connect’事件在走到这行代码前就发生了,所以这个事件在这里不可能捕捉到。不过现在看来也许是因为Node版本变化太快的原因吧。不过我在网上搜到一处Github上的代码,这个地方也是这样改的,相信他也遇到了同样的问题。还有人说把event改成‘connection’,但未能解决问题。

Day 2:他山之石

第四章开始讲RESTful Web服务了,我的理解就是用GET,POST,PUT和DELETE来进行CRUD操作。更详细的解释可以参考下面的链接,包括一些设计的常见误区。

理解RESTful架构

为了测试RESTful,这里需要一个cURL工具,我下载了一个Windows上的cURL

各个HTTP谓词的命令分别为:

POST: curl -d “item1” http://localhost:3000
GET: curl http://localhost3000
DELETE: curl -X DELETE http://localhost:3000/1
PUT: curl -X PUT http://localhost:3000/1?item2

最近听说了一些关于Node.js的负面评价,有人还搞出了fibjs,能更好地支持串行编程。不过我还是想先熟悉一下Node.js,另外还打算研究一下网络爬虫,并用Node.js实现一个。感觉这个东西用并行更好一点吧。

Day3 悬而未决

看到第5章:存储Node程序中的数据。

这一章主要讲和数据库的交互,当然也可以写文件来持久化。因为最近装了MySQL,所以实践了一下5.2.1节的内容。

遇到了一个问题,从数据库中取出Date类型的数据后,显示的数据很长,如“Tue Mar 13 2012 00:00:00 GMT+0800 (中国标准时间)”,而书上的示例显示的是“2012-03-13”。而查询数据库的时候,显示是简略版的。估计是和数据库的接口格式问题,暂时不深入研究了。

mysql> select * from work;
+----+-------+------------+----------+-------------+
| id | hours | date       | archived | description |
+----+-------+------------+----------+-------------+
|  5 |  6.00 | 2012-03-13 |        0 | a           |
|  7 |  6.00 | 2012-03-13 |        0 | b           |
+----+-------+------------+----------+-------------+
2 rows in set (0.00 sec)

由于PostgreSQL插件对Windows的支持可能不好,另外也没有安装这个数据库,5.2.2节略过。另外NoSQL也没有接触过,简单了解一下目前有Redis、MongoDB、Mongoose这些NoSQL。

Day 4 这世界变化快

第6章开始讲Connect框架及其中间件的使用。但是Connect的中间件已经发生了变化,所以第7章的内容已经有点过时,那些中间件都独立了,不再属于Connect。比如原来的connect.cookieParser已经变成了cookie-parser。可以用下面的方法安装

npm install cookie-parser

另外在Windows下的curl命令,Cookie是用分号分隔的,而不是书上的逗号。例如:

curl http://localhost:3000/ -H "Cookie: foo=bar; bar=baz"

测试签名cookie的时候,遇到了问题,服务器不能解析签名的cookie,试了SHA-1,SHA-256,MD5等方式的签名,都没有办法通过服务器的验证。后果就是后面的章节也没心情看了,第七章简单浏览了一下,顺手还提了一个勘误。不知道如果显示地安装老版本的connect,书上的代码能不能运行。

Day 5 虎头蛇尾

看第8章Express的时候问题更多了,主要是因为Node变化太快了。

有些问题找到了解决方法,比如8.1.2节在生成框架的时候,首先需要安装一下express-generator

npm install -g express-generator

等生成了框架,模板里面的内容变化也很大,而且运行的方式也不同。书上写的是运行"node app.js",但现在的框架需要运行的是:

node ./bin/www

第8章被卡住问题是8.4.2节的bodyParser和multipart中间件不工作,因为这个中间件可能也移出了express。记得曾经解决了这个问题,可惜没有记录下来,先不研究了。

前面数据库章节略掉的NoSQL在这一章算补上了,下载了一个Windows下的MongoDB,只要一个命令就启动了,比较傻瓜。

后续的章节就大体浏览了一下,这本书就算看完了吧。

总结

这就是我读这本书的过程,前后不到一个月,因为从我博客上的时间来看,是从2015年1月3日开始,到21日为止。可以看出看书的时候遇到了各种问题,有些容易解决,有些真的力不从心。感觉看书不容易啊,还需要这么多契机,比如云主机、密码泄露、机械键盘,然后还会遇到各种困难。

虽然有点虎头蛇尾,但这也跟Node的版本更新太快有关,有些例子实在不能用了。另外就是需要的知识太多,比如前端有EJS,Jade等模板,后端各种MySQL,PostgreSQL,MongoDB,Redis。

总体上说这本书不错,但是Node还在变化中,相关书籍可能过时得比较快,出版社再版重印的时候需要考虑一下这个问题了。