Express.JS使用詳解
安裝了node(下載)之后, 在你的機器上創(chuàng)建一個目錄,開始你的第一個應(yīng)用程序。
$ mkdir hello-world
在這個目錄中你將定義應(yīng)用程序“包”,這和任何其他node的包沒有什么不同。文件目錄中的json文件,明確定義了一個依賴項。你可以用npm命令獲取express最新版本,你喜歡這樣做,而不是安裝“3.x”以外的版本,以防止任何未知的驚喜。
{
"name": "hello-world",
"description": "hello world test app",
"version": "0.0.1",
"private": true,
"dependencies": {
"express": "3.x"
}
}
現(xiàn)在,您已經(jīng)有了一個包。json文件在這個目錄你可以使用npm(1)安裝這種依賴關(guān)系,在這種情況下只需要輸入:
$ npm install
一旦npm完成,你就會在/node_modules目錄中存有一個你依賴的Express 3.x。您可以用npm ls驗證這一點,就像以下代碼片段所展示的Express樹和自己的依賴關(guān)系。
$ npm ls hello-world@0.0.1 /private/tmp └─┬ express@3.0.0beta7 ├── commander@0.6.1 ├─┬ connect@2.3.9 │ ├── bytes@0.1.0 │ ├── cookie@0.0.4 │ ├── crc@0.2.0 │ ├── formidable@1.0.11 │ └── qs@0.4.2 ├── cookie@0.0.3 ├── debug@0.7.0 ├── fresh@0.1.0 ├── methods@0.0.1 ├── mkdirp@0.3.3 ├── range-parser@0.0.4 ├─┬ response-send@0.0.1 │ └── crc@0.2.0 └─┬ send@0.0.3 └── mime@1.2.6
現(xiàn)在來創(chuàng)建應(yīng)用程序本身!創(chuàng)建一個名為app.js或server.js文件,不論你喜歡哪一個,引入express,然后用express()創(chuàng)建一個新的應(yīng)用程序:
var express = require('express');
var app = express();
新應(yīng)用程序?qū)嵗梢酝ㄟ^app.VERB()開始定義路線,在這種情況下,通過“Hello World”字符串回應(yīng)“GET/”請求。req和res是提供給您的完全相同的node對象,因此你可能會調(diào)用res.pipe(),req.on('data', callback) 和其他你會做的與Express無關(guān)的事情。
Express增強這些對象為你提供更高層次的接口如res.send(),除此之外為你添加內(nèi)容長度:
app.get('/hello.txt', function(req, res){
res.send('Hello World');
});
現(xiàn)在為連接調(diào)用app.listen()方法綁定和監(jiān)聽,接受相同的參數(shù)作為節(jié)點的net.Server #listen():
var server = app.listen(3000, function() {
console.log('Listening on port %d', server.address().port);
});
使用express(1)來生成應(yīng)用程序
Express團隊維護便捷的項目生成器,命名為express-generator(1)。如果你用npm全局安裝express-generator,那么你可以從你電腦的任何地方訪問到它:
$ npm install -g express-generator
這個工具提供了一種簡單的方法來得到一個應(yīng)用程序框架,但范圍有限,例如,它只支持幾個模板引擎,而Express自己事實上支持為node建立任何網(wǎng)站框架模板??赏ㄟ^help查看:
Usage: express [options] Options: -h, --help output usage information -V, --version output the version number -e, --ejs add ejs engine support (defaults to jade) -H, --hogan add hogan.js engine support -c, --css add stylesheet support (less|stylus|compass) (defaults to plain css) -f, --force force on non-empty directory
如果你想生成一個任何情況都支持的應(yīng)用程序您只需要簡單地執(zhí)行::
$ express --css stylus 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的應(yīng)用程序,您必須安裝以下的依賴關(guān)系:
然后讓我們開始吧。
$ npm start
這是所有你需要讓一個簡單的應(yīng)用程序啟動并運行。記住,Express不綁定到任何特定的目錄結(jié)構(gòu),這些只是給你一個指導。應(yīng)用程序結(jié)構(gòu)的選擇可在github庫中查看 示例 。
錯誤處理
錯誤處理中間件定義就像普通中間件,然而必須定義4個參數(shù)數(shù)量,這是函數(shù)簽名(err, req, res, next):
app.use(function(err, req, res, next){
console.error(err.stack);
res.send(500, 'Something broke!');
});
雖然強制的錯誤處理中間件通常不是定義在最后,但在其他app.use()后,其調(diào)用如下所示:
var bodyParser = require('body-parser');
var methodOverride = require('method-override');
app.use(bodyParser());
app.use(methodOverride());
app.use(app.router);
app.use(function(err, req, res, next){
// logic
});
在這些中間件的響應(yīng)是完全任意的。您可能希望回應(yīng)一個HTML錯誤頁面,一個簡單的消息,一個JSON字符串,或任何其他你喜歡的回應(yīng)。
為構(gòu)建有組織的和更高層次的框架,你可以定義幾個這些錯誤處理中間件,就像你會定義普通中間件。例如假設(shè)您想為XHR請求定義一個錯誤處理器,除了這些之外,你可能會做的事如下:
var bodyParser = require('body-parser');
var methodOverride = require('method-override');
app.use(bodyParser());
app.use(methodOverride());
app.use(app.router);
app.use(logErrors);
app.use(clientErrorHandler);
app.use(errorHandler);
在更一般的logErrors可以寫請求和錯誤信息到stderr,loggly,或類似的服務(wù):
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“全方位”實現(xiàn)可以定義為:
function errorHandler(err, req, res, next) {
res.status(500);
res.render('error', { error: err });
}
用戶在線計數(shù)
本節(jié)詳細完整講解一個(小)應(yīng)用程序,使用Redis跟蹤用戶在線數(shù)量。首先創(chuàng)建一個包。json文件包含兩個附件,一個用于redis客戶端,另一個用于Express自己。也確保你已包裝了redis并且通過$redis-server運行。
{
"name": "app",
"version": "0.0.1",
"dependencies": {
"express": "3.x",
"redis": "*"
}
}
接下來,你需要創(chuàng)建一個應(yīng)用程序,和一個到redis的連接:
var express = require('express');
var redis = require('redis');
var db = redis.createClient();
var app = express();
接下來的中間件跟蹤在線用戶。在這里我們將使用排序集,這樣我們通過可以redis查詢在線用戶,僅需要N毫秒。我們通過時間戳作為成員的“在線標準”。注意, 這里我們使用user-agent字符串代替通常的用戶id。
app.use(function(req, res, next){
var ua = req.headers['user-agent'];
db.zadd('online', Date.now(), ua, next);
});
下一個中間件是在最后一刻使用zrevrangebyscore來獲取最大在線用戶數(shù)量,我們總是得到最近在線的用戶,他的上限是當前時間戳減去60000毫秒。
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();
});
});
最后,我們通過一個url使用它,并綁定到一個端口!這就完了,在一個新瀏覽器訪問這個應(yīng)用程序,您會看到在線人數(shù)增加。
app.get('/', function(req, res){
res.send(req.online.length + ' users online');
});
app.listen(3000);
Expree的反向代理
在反向代理背后使用Expree,如Varnish 或Nginx是微不足道的,然而它需要配置。通過啟用“信任代理”設(shè)置app.enable(“trust proxy”),Express有一些反向代理的技巧,X-Forwarded - *頭字段可能是可信的,否則他們可能很容易被欺騙。
啟用該設(shè)置有一些微妙的影響。第一個是X-Forwarded-Proto可能被反向代理設(shè)定,告訴app那是https或者只是簡單的http。這個值由req.protocol反射。
第二個變化是req.ip和req.ips值將填充X-Forwarded-For地址的列表。
調(diào)試Express
Express內(nèi)部使用調(diào)試模塊記錄路徑匹配和應(yīng)用程序模式的信息。要看到這條信息,只要簡單設(shè)置調(diào)試環(huán)境變量為express:*,當啟動應(yīng)用程序后,你將在控制臺看以調(diào)試信息。
$ DEBUG=express:* node ./bin/www
運行這個hello world示例將打印以下內(nèi)容:
express:application booting in development mode +0ms express:router defined get /hello.txt +0ms express:router defined get /hello.txt +1ms
另外, 表達可執(zhí)行(生成器)生成的程序也使用調(diào)試模塊,默認作用域是my-application調(diào)試命名空間。
你可以用以下命令啟用這些調(diào)試語句
$ DEBUG=my-application node ./bin/www
關(guān)于調(diào)試的更多信息,請參見調(diào)試 指南
相關(guān)文章
Node.js發(fā)送HTTP客戶端請求并顯示響應(yīng)結(jié)果的方法示例
這篇文章主要介紹了Node.js發(fā)送HTTP客戶端請求并顯示響應(yīng)結(jié)果的方法,結(jié)合完整實例形式分析了nodejs發(fā)送http請求及響應(yīng)的相關(guān)操作技巧,需要的朋友可以參考下2017-04-04
Node.js中的EventEmitter類使用小結(jié)
EventEmitter 是 Node.js 中的一個核心模塊,它提供了一種實現(xiàn)事件驅(qū)動編程的機制,它是一個基于觀察者模式的類,用于在應(yīng)用程序中處理事件和觸發(fā)事件,這篇文章主要介紹了Node.js中的EventEmitter類介紹,需要的朋友可以參考下2023-12-12
node.js中的http.response.writeHead方法使用說明
這篇文章主要介紹了node.js中的http.response.writeHead方法使用說明,本文介紹了http.response.writeHead的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下2014-12-12
Node.js通過配置?strict-ssl=false解決npm安裝卡住問題
使用npm安裝依賴包是常見的任務(wù)之一,有時會遇到安裝卡住的問題,本文就來介紹一下通過配置?strict-ssl=false解決npm安裝卡住問題,感興趣的可以了解一下2024-12-12
nodejs操作mongodb的填刪改查模塊的制作及引入實例
下面小編就為大家分享一篇nodejs操作mongodb的填刪改查模塊的制作及引入實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01
nodejs express搭建服務(wù)并熱更新文件過程詳解
這篇文章主要為大家介紹了nodejs express搭建服務(wù)并熱更新文件過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11

