Express 3.0新手指南入門教程

在確認已經安裝了node以後(下載), 在你的機器上建立一個目錄,讓咱們來開始你的第一個應用程序吧javascript

$ mkdir hello-world

在這個目錄中你首先得定義一下你的應用程序「包」文件,它和其它的node程序包是同樣的。 你得在這個目錄中建立一個package.json文件,在裏面express做爲一個依賴。 你也可使用 npm info express version 來獲取express最新的版本號, 最好使用最新的版本號而不是下面的3.x,這樣新出的功能就不會讓你感受到奇怪了。css

{
  "name": "hello-world",   "description": "hello world test app",   "version": "0.0.1",   "private": true,   "dependencies": {     "express": "3.x"   } }

如今package.json文件已經準備好了,使用npm(1) 安裝依賴, 這裏的依賴僅僅是Express。html

$ npm install

當npm完成後,Express 3.x 和它的依賴就安裝到你的 ./node_modules 目錄裏了。 你能夠經過 npm ls 來確認一下,它會把Express 和它的依賴展現成下面的樹狀結構。前端

$ 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

如今咱們來寫真正的代碼了!建立一個名爲app.js 或者 server.js的文件,叫什麼看你我的喜愛了。 載入express 而後使用代碼 express()建立一個新的應用程序:java

var express = require('express'); var app = express();

在這個應用程序實例裏,你能夠經過 app.VERB()定義路由,下面的例子是"GET /"返回 "Hello World" 字符串。 req 和 res 對象是和node原生提供給你的一致的,你也能夠執行 res.pipe(), req.on('data', callback) 等任何事情在沒有Express的狀況下能夠作的事情。node

app.get('/hello.txt', function(req, res){   var body = 'Hello World';   res.setHeader('Content-Type', 'text/plain');   res.setHeader('Content-Length', body.length);   res.end(body); });

Express 給這些對象加了一個封裝好的方法,好比 res.send(), 它會幫你設置Content-Length:nginx

app.get('/hello.txt', function(req, res){   res.send('Hello World'); });

如今咱們經過執行 app.listen() 來綁定並監聽鏈接。 它接受的參數和nodenet.Server#listen()的方法一致:git

app.listen(3000); console.log('Listening on port 3000');

使用express(1) 來生成一個應用程序

Express 附帶了一個能夠執行的文件,這裏命名爲 express(1). 若是你使用npm全局安裝的express, 在你的機器任何位置它都是可用的:github

$ npm install -g express

這個工具提供了一個很是簡單的生成一個程序骨架的功能,可是它也有侷限,好比它只支持不多的幾個模板引擎。 而事實上Express幾乎支持全部的爲node所建的模板引擎。 使用 --help查看一下幫助:redis

Usage: express [options] Options:   -h, --help          輸出幫助信息   -V, --version       輸出版本號   -s, --sessions      添加 session 支持   -e, --ejs           添加 ejs 模板引擎支持 (默認爲jade)   -J, --jshtml        添加 jshtml模板引擎支持 (默認爲jade)   -H, --hogan         添加 hogan.js模板引擎支持   -c, --css   樣式 <引擎> 支持 (less|stylus) (默認爲css)   -f, --force         強制在非空目錄執行

若是你想生成一個支持EJS, Stylus, 和session的應用程序,只須要簡單的執行下面的命令:

$ 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.ejs install dependencies:   $ cd myapp && npm install   run the app:   $ node app  

和其它node程序同樣,你必須安裝依賴:

$ cd myapp
$ npm install

而後讓咱們運行它吧!

$ node app

這些就是一個簡單的應用程序建立和運行的全部步驟。 記住Express沒有限定任何的目錄結構,這只是一個方便你工做的基本結構。 若是你想獲得更多怎麼組織目錄結構選擇,能夠查看github上的示例

錯誤處理

錯誤處理的中間件和普通的中間件定義是同樣的, 只是它必須有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列表裏的地址取代。

 

英文地址:http://expressjs.com/api.html

相關文章
相關標籤/搜索