在確認已經安裝了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 附帶了一個能夠執行的文件,這裏命名爲 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的前端使用一個反向代理,好比 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