學習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.ip 和
req.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