專門針對初學者的Node.js教程

轉載原文:http://www.csdn.net/article/2013-08-28/2816731-absolute-beginners-guide-to-nodejshtml

 

Node.js的教程並不缺少,但有大部分教程針對已有Node.js基礎的開發者。「我已下載了Node.js,可我如何開始呢?」如下教程是專門針對Node.js初學者,文中將經過實例分享,一步步教你如何開始Node.js之旅。  node

什麼是Node.js?web

不少初學者並無真正地理解Node.js究竟是什麼。nodejs.org網站中的描述也沒有多大幫助。數據庫

首先要清楚Node不是一個Web服務器,這十分重要。它自己並不能作任何事情。它沒法像Apache那樣工做。若是你但願它成爲一個HTTP服務器,你必須藉助它內置庫本身編寫。Node.js只是計算機上執行代碼的另外一種方式,它是一個簡單的JavaScript Runtime.express

安裝Node.jsnpm

Node.js的安裝十分容易。只需在這裏下載知足你須要的安裝程序便可。json

已安裝好Node.js,下一步作什麼?api

安裝結束後,你能夠輸入一個新命令「node」。使用該「node」命令有兩種不一樣的方法。第一種不帶任何參數,將打開一個交互式Shell「>」(REPL: read-eval-print-loop),你能夠在這裏執行JavaScript代碼。數組

 

[js]  view plain copy
  1. $ node  
  2. > console.log('Hello World');  
  3. Hello World  
  4. undefined  

 

上面案例中,我在Shell中鍵入了「console.log('Hello World')」,並敲回車。Node便開始執行該代碼,並顯示剛纔記錄的信息,同時打印出「undefined」。這是由於每條命令都會返回一個值,而console.log沒有任何返回,故輸出「undefined」。瀏覽器

Node命令的另外一種用法是執行一個JavaScript文件。這是咱們平時最經常使用的方法。

hello.js

 

[js]  view plain copy
  1. <b>console.log('Hello World');</b>  
[js]  view plain copy
  1. <b>$ node hello.js  
  2. Hello World</b>  

 

該案例中,我將「console.log('Hello World');」命令存入一個文件中,並將該文件做爲node命令的參數。Node運行文件中JavaScript代碼,並輸出「Hello World」。

案例一:文件的輸入與輸出

Node.js包含一組強大的庫(模塊),能夠幫助咱們作不少事。第一個案例中,我將打開一個Log文件,並對它進行解析。

example_log.txt

 

[js]  view plain copy
  1. <b>2013-08-09T13:50:33.166Z A 2  
  2. 2013-08-09T13:51:33.166Z B 1  
  3. 2013-08-09T13:52:33.166Z C 6  
  4. 2013-08-09T13:53:33.166Z B 8  
  5. 2013-08-09T13:54:33.166Z B 5</b>  

 

該Log數據什麼意思並不重要,基本能夠肯定每條信息都包含一條數據、一個字母和一個值。我但願將每一個字母后面的值進行累加。

咱們要作的第一件事是讀出文件的內容。

my_parser.js

 

[js]  view plain copy
  1. <b>// Load the fs (filesystem) module  
  2. var fs = require('fs');  
  3.   
  4. // Read the contents of the file into memory.  
  5. fs.readFile('example_log.txt', function (err, logData) {  
  6.   
  7.   // If an error occurred, throwing it will  
  8.   // display the exception and end our app.  
  9.   if (err) throw err;  
  10.   
  11.   // logData is a Buffer, convert to string.  
  12.   var text = logData.toString();  
  13. });</b>  

 

經過內置的文件(fs)模塊,咱們能夠很容易進行文件的輸入/輸出操做。fs模塊有一個readFile方法,該方法以文件路徑、回調函數爲參數。該回調函數在完成文件讀取後調用。文件數據讀取後存儲在Buffer類型中,爲基本的字節數組。咱們能夠經過toString()方法將它轉化爲字符串。

如今咱們對它進行解析。

my_parser.js

 

[js]  view plain copy
  1. <b>// Load the fs (filesystem) module.  
  2. var fs = require('fs');  
  3.   
  4. // Read the contents of the file into memory.  
  5. fs.readFile('example_log.txt', function (err, logData) {  
  6.   
  7.   // If an error occurred, throwing it will  
  8.   // display the exception and kill our app.  
  9.   if (err) throw err;  
  10.   
  11.   // logData is a Buffer, convert to string.  
  12.   var text = logData.toString();  
  13.   
  14.   var results = {};  
  15.   
  16.   // Break up the file into lines.  
  17.   var lines = text.split('\n');  
  18.   
  19.   lines.forEach(function(line) {  
  20.     var parts = line.split(' ');  
  21.     var letter = parts[1];  
  22.     var count = parseInt(parts[2]);  
  23.   
  24.     if(!results[letter]) {  
  25.       results[letter] = 0;  
  26.     }  
  27.   
  28.     results[letter] += parseInt(count);  
  29.   });  
  30.   
  31.   console.log(results);  
  32.   // { A: 2, B: 14, C: 6 }  
  33. });</b>  

 

如今,當你將該文件做爲node命令的參數時,執行該命令將打印出以下結果,執行完畢後退出。

 

[js]  view plain copy
  1. $ node my_parser.js  
  2. { A: 2, B: 14, C: 6 }  

 

我大部時候將Node.js做爲腳本使用,正如上面所展現的那樣。它更易於使用,是腳本程序有力的替代者。

異步回調

正如在上例中看到的那樣,Node.js典型的模式是使用異步回調。基本上,你告訴Node.js要作的事,它執行完後便會調用你的函數(回調函數)。這是由於Node是單線程的。在你等待回調函數執行過程當中,Node可繼續執行其餘事務,沒必要被阻塞直到該請求完畢。

這對於Web服務器尤爲重要。在現代Web應用訪問數據庫的過程當中特別廣泛。當你等待數據庫返回結果的過程當中,Node能夠處理更多請求。與每次鏈接僅處理一個線程相比,它使你以很小的開銷來處理成千上萬個並行鏈接。

案例二:HTTP服務器

Node內建有一個模塊,利用它能夠很容易建立基本的HTTP服務器。請看下面案例。

my_web_server.js

 

[js]  view plain copy
  1. <b>var http = require('http');  
  2.   
  3. http.createServer(function (req, res) {  
  4.   res.writeHead(200, {'Content-Type': 'text/plain'});  
  5.   res.end('Hello World\n');  
  6. }).listen(8080);  
  7.   
  8. console.log('Server running on port 8080.');</b>  

 

在上面,我說是的基本HTTP服務器。該例中所建立的並非一個功能全面的HTTP服務器,它並不能處理任何HTML文件、圖片。事實上,不管你請求什麼,它都將返回「Hello World」。你運行該代碼,並在瀏覽器中輸入「http://localhost:8080」,你將看見該文本。

 

[js]  view plain copy
  1. $ node my_web_server.js  

 

如今你可能已經注意到一些不同的東西。你的Node.js應用並無退出。這是由於你建立了一個服務器,你的Node.js應用將繼續運行,並響應請求,直到你關閉它。

若是你但願它成爲一個全功能的Web服務器,你必須檢查所收到的請求,讀取合適的文件,並返回所請求的內容。值得高興的是,有人已經幫你作了這個艱難的工做。

案例三:Express框架

Express爲一個框架,可以使建立網站的過程十分簡單。你首先須要安裝它。除了node命令,你還須要訪問「npm」命令。利用該工具,你能夠訪問社區所建立的龐大模塊集。其中之一就是Express。

 

[js]  view plain copy
  1. $ cd /my/app/location  
  2. $ npm install express  

 

當你安裝了一個模塊,它將出如今應用程序所在目錄的「node_modules」文件夾中。如今咱們能夠利用Express來建立一個基本的靜態文件服務器。

my_static_file_server.js

 

[js]  view plain copy
  1. <b>var express = require('express'),  
  2.     app = express();  
  3.   
  4. app.use(express.static(__dirname + '/public'));  
  5.   
  6. app.listen(8080);</b>  

 

 

[js]  view plain copy
  1. $ node my_static_file_server.js  

 

如今你已建立了一個強大的靜態文件服務器。你能夠經過瀏覽器請求訪問你放在public文件夾中任何文件,並進行展現,包括HTML、圖片等任何東西。好比,把一個名爲「my_image.png」的圖片放在public文件夾中,你能夠在瀏覽器中輸入「http://localhost:8080/my_image.png」來訪問該圖片。固然,Express還有不少特性,你能夠在之後的開發中繼續探索。

NPM

上面咱們已經接觸到了npm,但我仍想強調一下在Node.js開發過程當中該工具的重要性。它有成千上萬個模塊可幫咱們解決遇到的大部分典型問題。在從新發明輪子以前,記得檢查一下npm中是否有相應功能。 

上一例中,咱們手動安裝了Express。若是你的程序包含不少「依賴」(Dependency),那再利用該方法安裝它們就不合適了。爲此npm提供了一個package.json文件。

package.json

 

[js]  view plain copy
  1. <b>{  
  2.   "name" : "MyStaticServer",  
  3.   "version" : "0.0.1",  
  4.   "dependencies" : {  
  5.     "express" : "3.3.x"  
  6.   }  
  7. }</b>  

 

package.json文件包含了應用程序的基本信息。其中「dependencies」部分描述了你想安裝模塊的名稱和版本。該案例,接受Express 3.3的任何版本。你能夠在該部分列出你想要的全部依賴。

代替以前一個個安裝每一個依賴,如今咱們能夠運行一個命令,便可將它們所有安裝完成。

 

[js]  view plain copy
  1. $ npm install  

 

運行該命令,npm將在當下文件夾中查找「package.json」文件。一旦找到,便可安裝所列出的全部依賴。

代碼的組織

在大部分應用程序中,你的代碼每每被分割到幾個文件中。如今讓咱們把最開始案例中的Log分析腳本分離出來。這樣該程序將更易於測試與維護。

parser.js

 

[js]  view plain copy
  1. <b>// Parser constructor.  
  2. var Parser = function() {  
  3.   
  4. };  
  5.   
  6. // Parses the specified text.  
  7. Parser.prototype.parse = function(text) {  
  8.   
  9.   var results = {};  
  10.   
  11.   // Break up the file into lines.  
  12.   var lines = text.split('\n');  
  13.   
  14.   lines.forEach(function(line) {  
  15.     var parts = line.split(' ');  
  16.     var letter = parts[1];  
  17.     var count = parseInt(parts[2]);  
  18.   
  19.     if(!results[letter]) {  
  20.       results[letter] = 0;  
  21.     }  
  22.   
  23.     results[letter] += parseInt(count);  
  24.   });  
  25.   
  26.   return results;  
  27. };  
  28.   
  29. // Export the Parser constructor from this module.  
  30. module.exports = Parser;</b>  

 

在此建立了一個新文件,來存放Log分析腳本。這僅僅是一種標準JavaScript,還有不少方法可用來封裝該代碼。我選擇從新定義一個JavaScript對象,這樣更容易進行單元測試。

該程序中最重要的部分是「module.exports = Parser;」這一行代碼。它告訴Node從該文件中要輸出的內容。在該例中,我輸出了構造函數,用戶能夠用Parser對象來建立實例。你能夠輸出任何你想要的。

如今咱們看一下,如何導入該文件,來使用Parser對象。

my_parser.js

 

[js]  view plain copy
  1. <b>// Require my new parser.js file.  
  2. var Parser = require('./parser');  
  3.   
  4. // Load the fs (filesystem) module.  
  5. var fs = require('fs');  
  6.   
  7. // Read the contents of the file into memory.  
  8. fs.readFile('example_log.txt', function (err, logData) {  
  9.   
  10.   // If an error occurred, throwing it will  
  11.   // display the exception and kill our app.  
  12.   if (err) throw err;  
  13.   
  14.   // logData is a Buffer, convert to string.  
  15.   var text = logData.toString();  
  16.   
  17.   // Create an instance of the Parser object.  
  18.   var parser = new Parser();  
  19.   
  20.   // Call the parse function.  
  21.   console.log(parser.parse(text));  
  22.   // { A: 2, B: 14, C: 6 }  
  23. });</b>  

 

如模塊同樣,文件被引入其中,你須要輸入路徑,而非名稱。

總結

但願該教程能夠幫助到你。Node.js是一個強大、靈活的技術,能夠幫助解決各類各樣的問題。它已經超出了咱們的想像。(編譯:陳秋歌 審校:夏夢竹)

原文連接:An absolute beginner's guide to Node.js

相關文章
相關標籤/搜索