《Node.js實戰》學習筆記

滕瑞發表於2015-01-22

《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還在變化中,相關書籍可能過時得比較快,出版社再版重印的時候需要考慮一下這個問題了。

相關文章