Node.js是一種主流框架,它允許你使用JavaScript快速構建具有高度可伸縮性的網絡程序。可是,它有自己的學習曲線,這本較為深入的指南性圖書首先介紹了Node.js平臺的安裝,然后重點關注:創建和加載模塊;使用緩沖區對二進制數據進行處理、編碼和編碼;用事件發射器模式簡化事件綁定等。本書還涵蓋了從使用定時器制定函數執行計劃到創建和控制外部進程等內容,可以讓你為運行、構建和測試自定義模塊做好準備。
主要內容
◆ 介紹了查詢和讀寫文件
◆ 研究了流、文件系統、網絡和自動化單元測試
◆ 詳細描述了如何讀寫數據流
◆ 從零開始構建TCP和HTTP服務器與客戶端
◆ 介紹使用數據報、測試和調試模塊以及控制回調流程
◆ 展示了如何用Connect、Express和Socke.IO開發實時Web應用程序
◆ 引導你連接到MySQL、CouchDB和MongoDB數據庫
主要內容
◆ 介紹了實現位置跟蹤和接近警報的多種方法
◆ 揭秘SensorManager API中物理傳感器背后的物理原理,從而讓你了解正確的應用方式
◆ 展示了算法代碼來解釋帶噪聲的傳感器數據并檢測其變化
◆ 演示了如何測量設備屬性,例如方向和移動,以及類似相對高度這樣的環境屬性
◆ 探究如何使用Android開放附件(Android Open Accessory,AOA)來訪問外部傳感器
◆ 介紹近場通信(NFC)技術及其API
◆ 提供圖像和信號處理代碼來檢測攝像頭和麥克風所捕獲到的內容
◆ 給出使用Android語音識別和文本轉語音API來創建可靠、用戶友好、帶語音功能的應用所需的所有組件
《Node.js高級編程》主要內容: 介紹了查詢和讀寫文件 研究了流、文件系統、網絡和臼動化單元測試 詳細描述了如何讀寫數據流 從零開始構建TCP和HTTP服務器與客戶端 介紹使用數據報、測試和調試模塊以及控制回調流程 展示了如何用Connect、Express和Socke.10開發實時Web應用程序 引導你連接到MySQL、CouchDB和MongoDB數據庫
在1995年,也就是大學二年級時我開始接觸UNIX網絡編程。在C語言中,可以針對服務器的開放TCP連接創建套接字,并編寫服務器代碼來接受連接。我還記得第一次創建TCP服務器的興奮勁:我可以接受連接,并且能在服務器上收發消息。
如果我希望服務器接受大量并發連接,一般的解決方案是使用線程,不久之后我就創建了自己的第一個多線程TCP服務器,這個服務器會訪問一個共享數據結構,這個數據結構要同步大量產生的客戶端線程的訪問。事實已經證明,讓同步精細化(最大化資源和時間)和正確(避免死鎖)要比預計的困難。
幾年后,我成為一名顧問,從事編程工作,并領導程序員團隊實現不同的客戶端項目。一開始我還是繼續從事UNIX領域的工作,但是不久之后就轉而關注Java和它的企業化風格,最終落腳于使用PHP和Ruby這樣的腳本語言進行豐富多彩的Web開發。在從事Web開發時,我慢慢地開始熟悉JavaScript和事件驅動編程模型,卻從未意識到這會讓我再次與UNIX世界聯系到一起。
時間很快就到了2010年初,我的一位好朋友跟我談到Node.js,他說:“你可以用JavaScript對Node.js進行快速編程”。Node.js將事件驅動的瀏覽器編程引入了UNIX網絡編程世界。
出于好奇,我翻閱了一下Node.js的API文檔,立刻就被它吸引住了。這種不使用線程就能創建具有高度可伸縮性的服務器的易用性以及混搭的服務器與客戶端代碼促使我深入研究了Node的源代碼以及周邊模塊,Node.js將腳本語言的易用性與UNIX網絡編程能力全面結合起來,我感覺自己終于回家了。
本書讀者對象
本書是為那些熟練使用JavaScript進行瀏覽器或者服務器編程的開發者編寫的,讀者應該熟悉有關TCP和HTTP運行的基本概念。對于后面有關Web應用程序開發的幾章而言,如果讀者熟悉傳統的Web開發也會大有裨益。
如果你已經安裝了Node.js,就可以跳過第2章“Node簡介”。
如果你已經了解了Node.js內部運行的基本原理,并具有使用JavaScript進行服務器端事件驅動編程的基礎,那么可以跳過第3章“加載模塊”。
在介紹了Node.js的核心概念及API子集之后,我將會在第17章(“測試模塊及應用程序”)中開始構建應用程序,并在第18章(“調試模塊及應用程序”)中介紹調試,此外將在第19章(“控制回調流程”)中提出幾個控制異步流程的要點。
接下來,我會闡述構建Web應用程序時幾個必不可少的部分,從第20章(“構建和使用HTTP中間件”)開始,一直持續到Express.js(第21章),此外還會用Socket.IO(第22章)來創建實時Web應用程序。
最后,將會介紹在Node中如何訪問和使用數據庫,包括MySQL(第23章)、CouchDB(第24章)和MongoDB(第25章)。
本書涉及的內容
本書涉及Node.js v0.8、Express.js v2.5、Socket.io 0.9、Node-mysql v0.9、Nano v3.1以及Mongoose v2.7。
本書組織結構
本書從安裝和介紹Node.js開始。
然后闡述了Node的核心基礎,包括模塊、緩沖區、事件發射器模式以及定時器,之后介紹和闡述了Node中有關文件和網絡的核心基礎API,這些內容都會輔之以一些實用的示例。
介紹完Node的核心概念之后,本書接下來就會用Node.js進行以一些應用程序開發的最佳實踐,比如測試模塊、調試應用程序、維護對異步回調流程的控制。
構建實時Web應用程序是Node的主要用途之一,本書會向你展示如何使用Connect、Express.js和Socket.IO。
由于大多數應用程序都需要連接數據庫,因此本書還講述了如何在Node.js中連接和使用MySQL、CouchDB以及MongoDB。
使用本書的需求
為了安裝和運行Node.js應用程序,需要一臺PC計算機或者一臺Macintosh計算機運行最新版本的Node.js,Windows版、Linux版和MacOS版可以任選其一。
書中示例的源代碼可以在Wrox的網站上下載,網址是:www.wrox.com/remtitle.cgi? isbn=P010093766。
源代碼
在讀者學習本書中的示例時,可以手動輸入所有代碼,也可以使用本書附帶的源代碼文件。本書使用的所有源代碼都可以從本書合作站點http://www.wrox.com/或http://www. tupwk.com.cn/downpage上下載。登錄到站點http://www.wrox.com/,使用Search工具或使用書名列表就可以找到本書。接著單擊Download Code鏈接,就可以獲得所有的源代碼。既可以選擇下載一個大的包含本書所有代碼的ZIP文件,也可以只下載某個章節中的代碼。
在下載代碼后,只需用解壓縮軟件對它進行解壓縮即可。另外,也可以進入http://www. wrox.com/dynamic/books/download.aspx上的Wrox代碼下載主頁,查看本書和其他Wrox圖書的所有代碼。記住,可以使用書中列出的程序清單的編號容易地找到所要尋找的代碼,如“程序清單0-1”。
當為大多數可下載的源代碼文件命名時,我們會使用這些清單中的數值。對于那些很少的沒有用它自己的清單數值命名的程序清單,它們都與文件名匹配,所以很容易就可以在下載的源代碼文件中找到它們。
勘誤表
盡管我們已經盡了各種努力來保證文章或代碼中不出現錯誤,但是錯誤總是難免的,如果您在本書中找到了錯誤,例如拼寫錯誤或代碼錯誤,請告訴我們,我們將非常感激。通過勘誤表,可以讓其他讀者避免受挫,當然,這還有助于提供更高質量的信息。
要在網站上找到本書英文版的勘誤表,可以登錄http://www.wrox.com,通過Search工具或書名列表查找本書,然后在本書的細目頁面上,單擊Book Errata鏈接。在這個頁面上可以查看到Wrox編輯已提交和粘貼的所有勘誤項。完整的圖書列表還包括每本書的勘誤表,網址是www.wrox.com/misc-pages/booklist.shtml。
如果您發現的錯誤在我們的勘誤表里還沒有出現的話,請登錄www.wrox.com/contact/ techsupport.shtml并完成那里的表格,把您發現的錯誤發送給我們。我們會檢查您的反饋信息,如果正確,我們將在本書的勘誤表頁面張貼該錯誤消息,并在本書的后續版本加以修訂。
p2p. wrox.com
要與作者和同行討論,請加入p2p.wrox.com上的P2P論壇。這個論壇是一個基于Web的系統,便于您張貼與Wrox圖書相關的消息和相關技術,與其他讀者和技術用戶交流心得。該論壇提供了訂閱功能,當論壇上有新的消息時,它可以給您傳送感興趣的論題。Wrox作者、編輯和其他業界專家和讀者都會到這個論壇上來探討問題。
在http://p2p.wrox.com上,有許多不同的論壇,它們不僅有助于閱讀本書,還有助于開發自己的應用程序。要加入論壇,可以遵循下面的步驟:
(1) 進入p2p.wrox.com,單擊Register鏈接。
(2) 閱讀使用協議,并單擊Agree按鈕。
(3) 填寫加入該論壇所需要的信息和自己希望提供的其他可選信息,單擊Submit按鈕。
您會收到一封電子郵件,其中的信息描述了如何驗證賬戶,完成加入過程。
加入論壇后,就可以張貼新消息,響應其他用戶張貼的消息。可以隨時在Web上閱讀消息。如果要讓該網站給自己發送特定論壇中的消息,可以單擊論壇列表中該論壇名旁邊的Subscribe to this Forum圖標。
要想了解更多的有關論壇軟件的工作情況,以及P2P和Wrox圖書的許多常見問題的解答,就一定要閱讀FAQ,只需在任意P2P頁面上單擊FAQ鏈接即可。
第Ⅰ部分 概述和安裝
第1章 安裝Node 3
1.1 在Windows上安裝Node 4
1.2 在MAC OS X上安裝Node 6
1.3 使用源代碼安裝Node 7
1.3.1 選擇Node的版本 7
1.3.2 下載Node源代碼 7
1.3.3 編譯Node 8
1.3.4 安裝Node 8
1.3.5 運行Node 8
1.4 安裝和應用Node包管理器 9
1.5 本章小結 14
第2章 Node簡介 15
2.1 事件驅動編程風格介紹 16
2.2 Node和JavaScript如何簡化異步應用程序的編寫 17
第Ⅰ部分 概述和安裝
第1章 安裝Node 3
1.1 在Windows上安裝Node 4
1.2 在MAC OS X上安裝Node 6
1.3 使用源代碼安裝Node 7
1.3.1 選擇Node的版本 7
1.3.2 下載Node源代碼 7
1.3.3 編譯Node 8
1.3.4 安裝Node 8
1.3.5 運行Node 8
1.4 安裝和應用Node包管理器 9
1.5 本章小結 14
第2章 Node簡介 15
2.1 事件驅動編程風格介紹 16
2.2 Node和JavaScript如何簡化異步應用程序的編寫 17
2.2.1 什么是閉包 17
2.2.2 閉包如何輔助異步編程 18
2.3 本章小結 19
第Ⅱ部分 Node核心API基礎
第3章 加載模塊 23
3.1 理解Node如何加載模塊 24
3.2 導出模塊 24
3.3 加載模塊 25
3.3.1 加載核心模塊 25
3.3.2 加載文件模塊 26
3.3.3 加載文件夾模塊 26
3.3.4 從node_modules文件夾加載 26
3.3.5 緩存模塊 27
3.4 本章小結 28
第4章 應用緩沖區處理、編碼和解碼二進制數據 29
4.1 創建緩沖區 30
4.2 在緩沖區中獲取和設置數據 30
4.3 切分緩沖區 31
4.4 復制緩沖區 32
4.5 緩沖區解碼 32
4.6 本章小結 33
第5章 使用事件發射器模式簡化事件綁定 35
5.1 理解標準回調模式 35
5.2 理解事件發射器模式 36
5.3 理解事件類型 37
5.4 應用事件發生器API 38
5.4.1 使用.addListener( )或.on( )綁定回調函數 38
5.4.2 綁定多個事件監聽器 39
5.4.3 使用.removeListener( )從事件發射器中刪除一個事件監聽器 40
5.4.4 使用.once()使回調函數最多執行一次 40
5.4.5 使用.removeAllListeners()從事件發射器刪除所有事件監聽器 41
5.5 創建事件發射器 41
5.5.1 從Node事件發射器繼承 41
5.5.2 發射事件 42
5.6 本章小結 42
第6章 使用定時器制定函數執行計劃 45
6.1 使用setTimeout推遲函數執行 46
6.2 使用clearTimeout取消函數執行 46
6.3 制定和取消函數的重復執行計劃 47
6.4 使用process.nextTick將函數執行推遲到下一輪事件循環 47
6.5 阻塞事件循環 48
6.6 退出事件循環 49
6.7 使用setTimeout代替setInterval強制函數串行執行 49
6.8 本章小結 50
第Ⅲ部分 文件、進程、流和網絡
第7章 查詢和讀寫文件 53
7.1 處理文件路徑 54
7.1.1 規范化路徑 54
7.1.2 連接路徑 54
7.1.3 解析路徑 55
7.1.4 查找兩個絕對路徑之間的相對路徑 55
7.1.5 提取路徑的組成部分 55
7.1.6 確定路徑是否存在 56
7.2 fs模塊簡介 57
7.3 打開文件 58
7.4 讀取文件 58
7.4.1 寫入文件 59
7.4.2 關閉文件 60
7.5 本章小結 62
第8章 創建和控制外部進程 63
8.1 執行外部命令 63
8.2 生成子進程 68
8.2.1 創建子進程 68
8.2.2 監聽子進程的輸出數據 69
8.2.3 向子進程發送數據 69
8.2.4 當子進程退出時獲得通知 71
8.3 向進程發送信號并終止進程 72
8.4 本章小結 73
第9章 讀寫數據流 75
9.1 使用可讀流 76
9.1.1 等待數據 76
9.1.2 暫停與恢復流 76
9.1.3 了解流何時終止 77
9.2 使用可寫流 77
9.2.1 將數據寫入流 77
9.2.2 等待流被清空 78
9.3 考慮幾個流的例子 78
9.3.1 創建文件系統流 78
9.3.2 理解網絡流 80
9.4 避免慢客戶端問題以及挽救服務器 80
9.4.1 理解慢客戶端問題 80
9.4.2 避免慢客戶端問題 81
9.4.3 應用stream.pipe()避免慢客戶端問題與使用pipe()集成可讀流和可寫流 81
9.5 本章小結 82
第10章 構建TCP服務器 83
10.1 創建TCP服務器 83
10.1.1 應用套接字對象 85
10.1.2 理解空閑套接字 86
10.1.3 設置保持運行 87
10.1.4 應用延時或非延時 87
10.1.5 監聽連接 88
10.1.6 關閉服務器 88
10.1.7 處理錯誤 88
10.2 構建一個簡單的TCP聊天服務器 89
10.2.1 接受連接 89
10.2.2 從連接中讀取數據 89
10.2.3 聚合所有客戶端 90
10.2.4 廣播數據 91
10.2.5 刪除被關閉的連接 91
10.2.6 使用TCP聊天服務器 92
10.3 本章小結 93
第11章 構建HTTP服務器 95
11.1 理解http.ServerRequest對象 96
11.2 理解http.ServerResponse對象 98
11.2.1 寫入響應頭 98
11.2.2 修改或設置響應頭 98
11.2.3 刪除響應頭 99
11.2.4 寫入一塊響應主體 99
11.3 以流的形式傳送HTTP分塊響應 99
11.3.1 傳送文件 99
11.3.2 傳送其他進程的輸出 100
11.4 關閉服務器 100
11.5 示例1:構建提交靜態文件的服務器 101
11.6 示例2:使用HTTP分塊響應和定時器 102
11.7 本章小結 102
第12章 構建TCP客戶端 103
12.1 連接服務器 104
12.2 發送和接收數據 104
12.3 終止連接 105
12.4 處理錯誤 106
12.5 創建命令行TCP客戶端的示例 106
12.5.1 連接服務器 107
12.5.2 向服務器發送命令行 107
12.5.3 打印服務器消息 107
12.5.4 在連接終止時重新連接 108
12.5.5 關閉連接 110
12.5.6 前述內容綜合 111
12.6 本章小結 112
第13章 創建HTTP請求 113
13.1 創建GET請求 113
13.2 使用其他HTTP動詞 114
13.2.1 查看響應對象 115
13.2.2 獲取響應主體 116
13.2.3 以流的方式傳送響應主體 116
13.3 使用HTTP.Agent維護套接字池 116
13.4 應用第三方請求模塊簡化HTTP請求 118
13.4.1 安裝和應用request模塊 118
13.4.2 創建測試服務器 119
13.4.3 跟隨重定向 121
13.4.4 設置請求選項 122
13.4.5 對請求體進行編碼 125
13.4.6 流式傳送 126
13.4.7 使用Cookie Jar 127
13.5 本章小結 127
第14章 使用用戶數據報 129
14.1 理解用戶數據報 129
14.2 理解用戶數據報的使用 130
14.3 構建數據報服務器 130
14.3.1 監聽消息 130
14.3.2 測試服務器 131
14.3.3 查看附加的消息信息 132
14.4 創建簡單的數據報回送服務器 132
14.4.1 等待消息 132
14.4.2 向發送端發回消息 132
14.4.3 前述內容綜合 133
14.5 構建數據報客戶端 133
14.5.1 創建客戶端 134
14.5.2 發送消息 134
14.5.3 關閉套接字 134
14.6 創建一個簡單的數據報命令行客戶端 134
14.6.1 讀取命令行 135
14.6.2 向服務器發送數據 135
14.6.3 從服務器接收數據 135
14.6.4 前述內容綜合 136
14.7 理解和使用數據報多播 136
14.7.1 接收多播消息 137
14.7.2 發送多播消息 137
14.7.3 理解數據報最大容量 138
14.8 本章小結 138
第15章 用TLS/SSL保證服務器的安全性 139
15.1 理解私鑰和公鑰 139
15.1.1 產生私鑰 140
15.1.2 產生公鑰 140
15.2 構建TLS服務器 140
15.2.1 初始化服務器 141
15.2.2 監聽連接 141
15.2.3 從客戶端讀取數據 142
15.2.4 向客戶端發送數據 142
15.2.5 終止連接 142
15.3 構建TLS客戶端 142
15.3.1 初始化客戶端 143
15.3.2 連接服務器 143
15.3.3 驗證服務器證書 143
15.3.4 向服務器發送數據 144
15.3.5 從服務器讀取數據 144
15.3.6 終止連接 144
15.4 創建幾個示例 144
15.4.1 創建TLS聊天服務器 145
15.4.2 創建TLS命令行聊天客戶端 146
15.4.3 驗證客戶端證書 147
15.5 本章小結 148
第16章 用HTTPS保證HTTP服務器的安全性 149
16.1 構建安全的HTTP服務器 149
16.1.1 設置服務器選項 150
16.1.2 監聽連接 150
16.1.3 驗證HTTPS客戶端證書 151
16.2 創建HTTPS客戶端 152
16.2.1 初始化客戶端 152
16.2.2 創建請求 152
16.2.3 驗證HTTPS服務器證書 153
16.3 本章小結 154
第Ⅳ部分 構建與調試模塊及應用程序
第17章 測試模塊及應用程序 157
17.1 應用測試運行工具 157
17.1.1 編寫測試 158
17.1.2 運行測試 159
17.2 使用斷言測試模塊 159
17.2.1 使用斷言模塊 159
17.2.2 使用Node-Tap中的內置斷言函數 161
17.3 測試異步模塊 163
17.4 本章小結 166
第18章 調試模塊及應用程序 167
18.1 使用console.log 167
18.2 使用Node內置調試器 169
18.3 使用Node檢查器 173
18.4 本章小結 175
第19章 控制回調流程 177
19.1 理解飛去來器效應 177
19.2 通過聲明函數避免飛去來器效應 179
19.3 使用ASYNC流程控制庫 183
19.3.1 串行執行 184
19.3.2 并行執行 185
19.3.3 連續傳遞 186
19.3.4 排隊 187
19.3.5 迭代 189
19.3.6 映射 190
19.3.7 規約 191
19.3.8 過濾 192
19.3.9 檢測 193
19.4 本章小結 194
第Ⅴ部分 構建Web應用程序
第20章 構建和使用HTTP中間件 197
20.1 理解Connect HTTP中間件框架 198
20.2 構建自定義HTTP中間件 198
20.2.1 創建異步中間件 199
20.2.2 在中間件內部注冊回調函數 201
20.2.3 在中間件內處理錯誤 202
20.3 使用捆綁在Connect中的HTTP中間件 206
20.3.1 記錄請求 206
20.3.2 處理錯誤 208
20.3.3 提交靜態文件 209
20.3.4 解析查詢字符串 210
20.3.5 解析請求主體 211
20.3.6 解析Cookies 212
20.3.7 使用會話 213
20.3.8 其他可用的中間件 216
20.4 本章小結 216
第21章 用Express.js創建Web應用程序 217
21.1 初始化Express.js應用程序 218
21.2 在應用程序中設置中間件 220
21.3 路由請求 222
21.3.1 處理路由 222
21.3.2 使用會話 229
21.3.3 使用路由中間件 234
21.4 本章小結 238
第22章 使用Socket.IO創建通用的實時Web應用程序 241
22.1 理解WebSockets如何工作 242
22.2 使用Socket.IO創建WebSocket應用程序 243
22.2.1 在服務器上安裝和運行Socket.IO 243
22.2.2 使用Socket.IO創建實時網絡聊天應用程序 245
22.2.3 擴展聊天應用程序 250
22.2.4 檢測連接斷開 253
22.2.5 將用戶分隔到聊天室中 255
22.2.6 使用名稱空間 259
22.2.7 使用Redis分布運行服務器端應用程序 260
22.3 本章小結 263
第Ⅵ部分 連接數據庫
第23章 使用node-mysql連接MySQL數據庫 267
23.1 應用庫與MySQL數據庫進行連接和通信 267
23.2 向數據庫添加數據時請記住安全性 269
23.3 高效讀取數據 272
23.4 本章小結 276
第24章 使用Nano連接CouchDB數據庫 277
24.1 安裝Nano 278
24.2 連接和創建數據庫 281
24.3 存儲文檔 285
24.4 創建和使用CouchDB視圖 286
24.5 將文件附加到CouchDB文檔上 299
24.6 本章小結 312
第25章 使用Mongoose連接MongoDB 數據庫 313
25.1 安裝Mongoose 315
25.2 理解Mongoose如何使用模型封裝對數據庫的訪問 315
25.3 連接MongoDB數據庫 316
25.4 定義模式 316
25.5 定義模型 316
25.5.1 使用驗證器 326
25.5.2 使用修改器 332
25.5.3 使用取值器 333
25.5.4 使用虛擬屬性 334
25.5.5 使用默認值 340
25.5.6 定義索引 341
25.5.7 使用DB Refs引用其他文檔 343
25.5.8 定義實例方法 349
25.5.9 定義靜態方法 350
25.6 本章小結 351