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

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

發表於2013-08-28 14:09| 2075次閱讀| 來源Modulus Blog| 11 條評論| 作者Modulus Blog

node.js前端開發JavaScript 摘要:這是一篇專門針對Node.js初學者的教程。該教程將通過具體實例,教你一步步開始Node.js之旅。

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

什麼是Node.js?

很多初學者並沒有真正地理解Node.js到底是什麼。nodejs.org網站中的描述也沒有多大幫助。

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

安裝Node.js

Node.js的安裝十分容易。只需在這裡下載滿足你需要的安裝程序即可。

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

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

1234 $ node> console.log("Hello World");Hello Worldundefined

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

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

hello.js

1 <b>console.log("Hello World");</b>
12 <b>$ node hello.jsHello World</b>

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

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

Node.js包含一組強大的庫(模塊),可以幫助我們做很多事。第一個案例中,我將打開一個Log文件,並對它進行解析。

example_log.txt

12345 <b>2013-08-09T13:50:33.166Z A 22013-08-09T13:51:33.166Z B 12013-08-09T13:52:33.166Z C 62013-08-09T13:53:33.166Z B 82013-08-09T13:54:33.166Z B 5</b>

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

我們要做的第一件事是讀出文件的內容。

my_parser.js

12345678910111213 <b>// Load the fs (filesystem) modulevar fs = require("fs");// Read the contents of the file into memory.fs.readFile("example_log.txt", function (err, logData) {// If an error occurred, throwing it will// display the exception and end our app.if (err) throw err;// logData is a Buffer, convert to string.var text = logData.toString();});</b>

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

現在我們對它進行解析。

my_parser.js

123456789101112131415161718192021222324252627282930313233 <b>// Load the fs (filesystem) module.var fs = require("fs");// Read the contents of the file into memory.fs.readFile("example_log.txt", function (err, logData) {// If an error occurred, throwing it will// display the exception and kill our app.if (err) throw err;// logData is a Buffer, convert to string.var text = logData.toString();var results = {};// Break up the file into lines.var lines = text.split("
"
);lines.forEach(function(line) {var parts = line.split(" ");var letter = parts[1];var count = parseInt(parts[2]);if(!results[letter]) {results[letter] = 0;}results[letter] += parseInt(count);});console.log(results);// { A: 2, B: 14, C: 6 }});</b>

現在,當你將該文件作為node命令的參數時,執行該命令將列印出如下結果,執行完畢後退出。

12 $ node my_parser.js{ A: 2, B: 14, C: 6 }

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

非同步回調

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

這對於Web伺服器尤其重要。在現代Web應用訪問資料庫的過程中特別普遍。當你等待資料庫返回結果的過程中,Node可以處理更多請求。與每次連接僅處理一個線程相比,它使你以很小的開銷來處理成千上萬個並行連接。

案例二:HTTP伺服器

Node內建有一個模塊,利用它可以很容易創建基本的HTTP伺服器。請看下面案例。

my_web_server.js

12345678 <b>var http = require("http");http.createServer(function (req, res) {res.writeHead(200, {"Content-Type": "text/plain"});res.end("Hello World
"
);}).listen(8080);console.log("Server running on port 8080.");</b>

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

1 $ node my_web_server.js

現在你可能已經注意到一些不一樣的東西。你的Node.js應用並沒有退出。這是因為你創建了一個伺服器,你的Node.js應用將繼續運行,並響應請求,直到你關閉它。

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

案例三:Express框架

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

12 $ cd /my/app/location$ npm install express

當你安裝了一個模塊,它將出現在應用程序所在目錄的「node_modules」文件夾中。現在我們可以利用Express來創建一個基本的靜態文件伺服器。

my_static_file_server.js

123456 <b>var express = require("express"),app = express();app.use(express.static(__dirname + "/public"));app.listen(8080);</b>
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

1234567 <b>{"name" : "MyStaticServer","version" : "0.0.1","dependencies" : {"express" : "3.3.x"}}</b>

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

代替之前一個個安裝每個依賴,現在我們可以運行一個命令,即可將它們全部安裝完成。

1 $ npm install

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

代碼的組織

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

parser.js

123456789101112131415161718192021222324252627282930 <b>// Parser constructor.var Parser = function() {};// Parses the specified text.Parser.prototype.parse = function(text) {var results = {};// Break up the file into lines.var lines = text.split("
"
);lines.forEach(function(line) {var parts = line.split(" ");var letter = parts[1];var count = parseInt(parts[2]);if(!results[letter]) {results[letter] = 0;}results[letter] += parseInt(count);});return results;};// Export the Parser constructor from this module.module.exports = Parser;</b>

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

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

現在我們看一下,如何導入該文件,來使用Parser對象。

my_parser.js

1234567891011121314151617181920212223 <b>// Require my new parser.js file.var Parser = require("./parser");// Load the fs (filesystem) module.var fs = require("fs");// Read the contents of the file into memory.fs.readFile("example_log.txt", function (err, logData) {// If an error occurred, throwing it will// display the exception and kill our app.if (err) throw err;// logData is a Buffer, convert to string.var text = logData.toString();// Create an instance of the Parser object.var parser = new Parser();// Call the parse function.console.log(parser.parse(text));// { A: 2, B: 14, C: 6 }});</b>

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

總結

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

推薦閱讀:

nodejs收集日誌,rsyslog同步收集入es的實施
Koa2源碼設計之中間件和屬性代理
「Go語言編程」5,go和node.js的對比
02.Egg源碼解讀:多進程模型和進程間通訊
手把手教你用vue+node+mongodb搭建一個小商城(1.前期準備工作)

TAG:Node.js | 學者 | 初學者 | 教程 | 初學 |