1. 程式人生 > >學習NodeJS的一點總結---Express

學習NodeJS的一點總結---Express

       在學校NodeJS中遇到了各種各樣的問題,尤其是因為版本更新,而產生的一些包的不相容問題,下面寫一下關於Express遇到的問題。

首先引用別人的一下總結:

       node的安裝分為全域性模式和本地模式。
一般情況下會以本地模式執行,包會被安裝到和你的應用程式程式碼的本地node_modules目錄下。
在全域性模式下,Node包會被安裝到Node的安裝目錄下的node_modules下。

全域性安裝命令為$npm install -g moduleName。
獲知使用$npm set global=true來設定安裝模式,$npm get global可以檢視當前使用的安裝模式。

示例:
npm install express
預設會安裝express的最新版本,也可以通過在後面加版本號的方式安裝指定版本,如npm install [email protected]

npm install <name> -g
將包安裝到全域性環境中

但是程式碼中,直接通過require()的方式是沒有辦法呼叫全域性安裝的包的。全域性的安裝是供命令列使用的,就好像全域性安裝了vmarket後,就可以在命令列中直接執行vm命令

npm install <name> --save
安裝的同時,將資訊寫入package.json中專案路徑中如果有package.json檔案時,直接使用npm install方法就可以根據dependencies配置安裝所有的依賴包,這樣程式碼提交到github時,就不用提交node_modules這個檔案夾了。

2、npm view moduleNames:檢視node模組的package.json資料夾
注意事項:如果想要檢視package.json資料夾下某個標籤的內容,可以使用$npm view moduleName labelName

3、npm list:檢視當前目錄下已安裝的node包
注意事項:Node模組搜尋是從程式碼執行的當前目錄開始的,搜尋結果取決於當前使用的目錄中的node_modules下的內容。$ npm list parseable=true可以目錄的形式來展現當前安裝的所有node包

4、npm help:檢視幫助命令

5、npm view moudleName dependencies:檢視包的依賴關係

6、npm view moduleName repository.url:檢視包的原始檔地址

7、npm view moduleName engines:檢視包所依賴的Node的版本

8、npm help folders:檢視npm使用的所有資料夾

9、npm rebuild moduleName:用於更改包內容後進行重建

10、npm outdated:檢查包是否已經過時,此命令會列出所有已經過時的包,可以及時進行包的更新

11、npm update moduleName:更新node模組

12、npm uninstall moudleName:解除安裝node模組

13、一個npm包是包含了package.json的資料夾,package.json描述了這個資料夾的結構。訪問npm的json資料夾的方法如下:
$ npm help json
此命令會以預設的方式開啟一個網頁,如果更改了預設開啟程式則可能不會以網頁的形式開啟。

14、釋出一個npm包的時候,需要檢驗某個包名是否已存在
$ npm search packageName

15、npm init:會引導你建立一個package.json檔案,包括名稱、版本、作者這些資訊等

16、npm root:檢視當前包的安裝路徑
npm root -g:檢視全域性的包的安裝路徑

17、npm -v:檢視npm安裝的版本

      以上是在網上查詢的一些資料。在學習Express框架時,我們一般是建立本地模組,安裝方法為

首先編寫一空的package.json。這樣但你安裝模組是,它會自動加依賴新增進去。

安裝Express模組:G:\nodejs\MongodeTest>npm install express --save

這樣在你的工程下就好建立一個node_modules資料夾,express就安裝在裡面。

     一般Express團隊維護了一個可以快速生成專案模板的可執行檔案,

安裝方法:G:\nodejs\MongodeTest>npm install -g express-generator

這樣我們就可以用express來管理了:如檢視express版本:

G:\nodejs\MongodeTest>express -V
4.10.0

        這個工具提供了一個非常簡單的生成一個程式骨架的功能,但是它也有侷限,比如它只支援很少的幾個模板引擎。而事實上Express幾乎支援所有的為node所建的模板引擎。使用 --help檢視一下幫助:

Usage: express [options]

Options:

  -h, --help          輸出幫助資訊
  -V, --version       輸出版本號
  -e, --ejs           新增 ejs 模板引擎支援 (預設為jade)
  -H, --hogan         新增 hogan.js模板引擎支援
  -c, --css   樣式 <引擎> 支援 (less|stylus) (預設為css)
  -f, --force         強制在非空目錄執行

如果你想生成一個支援Jade, Stylus的應用程式,只需要簡單的執行下面的命令:

express --sessions --css stylus --ejs myapp

create : myapp
create : myapp/package.json
create : myapp/app.js
create : myapp/public
create : myapp/public/javascripts
create : myapp/public/images
create : myapp/public/stylesheets
create : myapp/public/stylesheets/style.styl
create : myapp/routes
create : myapp/routes/index.js
create : myapp/views
create : myapp/views/index.jade
create : myapp/views/layout.jade

install dependencies:
  $ cd myapp && npm install
  
run the app:
  $ DEBUG=myapp node app  
  

和其它node程式一樣,你必須安裝依賴:

$ cd myapp
$ npm install

然後讓我們執行它吧!

錯誤處理

錯誤處理的中介軟體和普通的中介軟體定義是一樣的,只是它必須有4個形參,這是它的形式:(err, req, res, next):

app.use(function(err, req, res, next){
  console.error(err.stack);
  res.send(500, 'Something broke!');
});

一般來說非強制性的錯誤處理一般被定義在最後,下面的程式碼展示的就是放在別的app.use() 之後:

app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(function(err, req, res, next){
  // logic
});

在這些中介軟體裡的響應是可以任意定義的。只要你喜歡,你可以返回任意的內容,譬如HTML頁面, 一個簡單的訊息,或者一個JSON字串。

對於一些組織或者更高層次的框架,你可能會像定義普通的中介軟體一樣定義一些錯誤處理的中介軟體。假設你想定義一箇中間件區別對待通過XHR和其它請求的錯誤處理,你可以這麼做:

app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(logErrors);
app.use(clientErrorHandler);
app.use(errorHandler);

通常logErrors用來紀錄諸如stderr, loggly, 或者類似服務的錯誤資訊:

function logErrors(err, req, res, next) {
  console.error(err.stack);
  next(err);
}

clientErrorHandler 定義如下,注意錯誤非常明確的向後傳遞了。

function clientErrorHandler(err, req, res, next) {
  if (req.xhr) {
    res.send(500, { error: 'Something blew up!' });
  } else {
    next(err);
  }
}

下面的errorHandler "捕獲所有" 的異常, 定義為:

function errorHandler(err, req, res, next) {
  res.status(500);
  res.render('error', { error: err });
}

線上使用者計數

這一小節我們講解一個小而全的應用程式,它通過Redis記錄線上使用者數。首先你需要建立一個package.json 檔案,包含兩個依賴,一個是redis 客戶端,另一個是Express。另外需要確認你安裝了redis, 可以能過執行$ redis-server來確認:

{
  "name": "app",
  "version": "0.0.1",
  "dependencies": {
    "express": "3.x",
    "redis": "*"
  }
}

接下來你需要你建立一個應用程式,和一個redis連線:

var express = require('express');
var redis = require('redis');
var db = redis.createClient();
var app = express();

接下來是紀錄使用者線上的中介軟體。這裡我們使用sorted sets, 它的一個好處是我們可以查詢最近N毫秒內線上的使用者。我們通過傳入一個時間戳來當作成員的"score"。注意我們使用 User-Agent 作為一個標識使用者的id。

app.use(function(req, res, next){
  var ua = req.headers['user-agent'];
  db.zadd('online', Date.now(), ua, next);
});

下一個中介軟體是通過zrevrangebyscore來查詢上一分鐘線上使用者。我們將能得到從當前時間算起在60,000毫秒內活躍的使用者。

app.use(function(req, res, next){
  var min = 60 * 1000;
  var ago = Date.now() - min;
  db.zrevrangebyscore('online', '+inf', ago, function(err, users){
    if (err) return next(err);
    req.online = users;
    next();
  });
});

最後我們來使用它,繫結到一個埠!這些就是這個程式的一切了,在不同的瀏覽器裡訪問這個應用程式,你會看到計數的增長。

app.get('/', function(req, res){
  res.send(req.online.length + ' users online');
});

app.listen(3000);

給Express加一層代理

在Express的前端使用一個反向代理,比如 Varnish 或者 Nginx是非常常見的,它不需要額外的配置。在通過app.enable('trust proxy')激活了"trust proxy" 設定後,Express 就會知道它在一個代理的後面,X-Forwarded-* 必須被信任,通常情況下這些頭是很容易被偽裝的。

使用了這個設定後會有一些很棒的小變化。 首先由代理設定的X-Forwarded-Proto 會告訴程式它是https 還是http 。這個值會影響req.protocol.

第二個變化是 req.ipreq.ips 的值會被X-Forwarded-For列表裡的地址取代。

除錯 Express

Express使用 debug 模組來輸出資訊。如果想看到這些資訊,可以在執行你的程式時設定 DEBUG 環境變數為 express:* ,除錯資訊會輸出在終端裡 。

$ DEBUG=express:* node app.js

使用上面的方式執行 hello world 的例子,將會輸出下面的內容

express:application booting in development mode +0ms
express:router defined get /hello.txt +0ms
express:router defined get /hello.txt +1ms
原文:http://expressjs.jser.us/guide.html