初步瞭解nodejs

什麼是Node.js?html

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

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

安裝Node.js數據庫

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

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

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

 $ node  
 > console.log('Hello World');  
 Hello World  
 undefined  

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

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

hello.js 瀏覽器

console.log('Hello World');
$ node hello.js  
Hello World

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

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

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

example_log.txt

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 

 1 // 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 });

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

如今咱們對它進行解析。

my_parser.js 

 1 // 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 });

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

$ 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 

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

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

$ node my_web_server.js  

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

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

案例三:Express框架

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

1 $ cd /my/app/location  
2 $ npm install express  

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

my_static_file_server.js

1 <b>var express = require('express'),
2     app = express();
3 
4 app.use(express.static(__dirname + '/public'));
5 
6 app.listen(8080);</b>
$ 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 

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

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

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

$ npm install

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

代碼的組織

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

parser.js 

// 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('\n');

  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;

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

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

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

my_parser.js 

 1 // 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 });

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

總結

但願該教程能夠幫助到你。Node.js是一個強大、靈活的技術,能夠幫助解決各類各樣的問題。它已經超出了咱們的想像

原文連接:http://blog.modulus.io/absolute-beginners-guide-to-nodejs

相關文章
相關標籤/搜索