相關閱讀:javascript
Express 4.X API 翻譯[一] -- Application篇css
Express 4.X Api 翻譯[二] -- Request篇html
本文是Express 4.x Api翻譯系列的第一篇。因爲筆者最近在學習NodeJs,剛剛接觸了Node式的開發模式,被異步IO的編程方式深深吸引,因而準備系統學習一下這項新技術。由於沒有任何NodeJs的基礎,也不知道從何學起,以前也研究過ByVoid的《NodeJs開發指南》也不知道算不算入門。想試着寫一下里面的微博例子,可是發現本身安裝的Express是最新的4.X,網上對於Express的內容原本就不多,更別說是最新的開發文檔了,索性就開始先翻譯一下Express的Api,本篇是Express 4.x中文手冊的第一篇,如下內容來自原文網站 >>>Express官方網站jquery
寫在前面正則表達式
本文適用的Express版本爲V4.0.0,一下內容不能保證一樣適用於以前的版本。因爲筆者屬於剛剛接觸Express因此沒有研究過以前的版本與4.0.0版本的區別,以後在接下來的時間裏,筆者會翻譯更多關於Express的文章供你們學習。express
建立一個express應用編程
var express = require('express'); var app = express(); app.get('/',function(req,res){ res.send('hello world'); }); app.listen(3000);
如下的設置選項將爲您展現如何改變Express的行爲:json
將設置項name的值設置爲value
app.set('title',My Site); app.get('title');//=>"My Site"
獲取設置項name的值
app.get('title'); //=> undefined app.set('title','My Site'); app.get('title'); //=>"My Site"
將設置項name的值設爲true
app.enable('trust proxy'); app.get('trust proxy'); //=>true
將設置項name的值設置爲false
app.disable('trust proxy'); app.get('trust proxy'); //=>false
檢查設置項name的狀態是否爲激活狀態
app.enabled('trust proxy'); //=>false app.enable('trust proxy'); app.enabled('trust proxy'); //=>true
檢查設置項name的狀態是否爲未激活狀態
app.disabled('trust proxy'); //=>true app.disable('trust proxy'); app.disabled('trust proxy'); //=>false
使用給定的中間件function,可選參數path,默認爲」/」.
var express = require('express'); var app = express(); //simple logger app.use(function(req,res,next){ console.log("%s %s",req.method,req.url); next(); }); app.use(function(req,res,next){ res.send('Hello World'); }); app.listen(3000);
//GET /javascript/jquery.js //GET /style.css //GET /favicon.ico app.use(express.static(__dirname + '/public'));
//GET /static/javascripts/jquery.js //GET /static/style.css //GET /static/favicon.ico app.use('/static',express.static(__dirname + '/public'));
var logger = require('morgan'); app.use(logger()); app.use(express.static(__dirname + '/public')); app.use(function(req,res){ res.send('Hello'); });
app.use(express.static(__dirname + '/public')); app.use(logger()); app.use(function(req,res){ res.send('Hello'); });
app.use(express.static(__dirname + '/public')); app.use(express.static(__dirname + '/files')); app.use(express.static(__dirname + 'uploads'));
註冊模板引擎的callback來處理擴展名爲ext的文件,默認狀況下會根據文件的擴展名開引入相應的模板引擎。例如,若是你試圖渲染一個」foo.jade」文件,Express將會在內部調用下面的代碼,而且緩存require()以便提升在以後的調用的性能。
app.engine('jade',require('jade').__express);
若是您使用的這個模板引擎沒有提供 .__express的開箱即用的方法-或者若是你想要「映射」一個不一樣的擴展名用於模板引擎,你可使用這個方法。例如映射EJS模板引擎來渲染」.html」文件
app.engine('html',require('ejs').renderFile);
在這個例子中,EJS提供了一個.renderFile()方法和Express預期的格式:(path,options,callback)一致,注意,這樣能夠在內部爲ejs.__express取一個別名,所以你能夠繼續使用」.ejs」擴展名而不須要額外作任何事。
一些模板引擎沒有遵循這種轉換約定,這裏有個小項目consolidate.js專門把全部的node流行的模板引擎進行了包裝,這樣他們在Express內部看起來就同樣了。
var engines = require('consolidate'); app.engine('haml',engines.haml); app.engine('html',engines.hogan);
app.param('user',function(req,res,next,id){ User.find(id,function(err,user){ if(err){ next(err); } else if(user){ req.user = user; next(); } else { next(new Error('failed to load user')); } }); });
這個例子有點高級,當檢測到若是第二個參數爲正則表達式的話,返回一個很像上面」user」例子的行爲的回調函數
app.param(function(name,fn){ if(fn instanceof RegExp) { return function(req,res,next,val){ var captures; if (captures = fn.exec(String(val))){ req.params[name] = captures; next(); } else{ next('route'); } } } });
這個函數如今能夠很是有效的用來校驗參數,或者提供正則捕獲後的分組。
app.param('id',/^\d+$/); app.get('/user/:id',function(req,res){ res.send('user' + req.params.id); }); app.apram('range',/^(\w+)\.\.(\W+)?$/); app.get('/range/:range',function(req,res){ var range = req.param.range; res.send('from ' + range[1] + 'to ' + range[2] ); });
app.VERB()方法爲Express提供了路由方法,這裏的VERB指的是一種HTTP動做,好比說app.post()。能夠提供多個callback,這多個callback都將會被同等對待,他們的行爲就像是中間件同樣,但也有一個例外的狀況,若是某一個callback調用了next(‘route’),那麼他後面的callback就會被忽略。這種狀況會被應用在當知足一個路由前綴,可是不須要用這個回調函數處理這個路由,因而就把它向後傳遞。
下面的這個代碼片斷演示了一個最簡單的路由定義。Express會吧字符串表達式轉換爲正則表達式,而後在內部匹配傳入的表達式。請求參數將不會被考慮進來。例如 「GET /」將會匹配下面的路由規則,一樣 「GET /?name=tobi」也會被下面的規則匹配。
app.get('/',function(req,res){ res.send('Hello World'); });
正則表達式也是能夠被使用的,尤爲是在你有特別的限制時這將會是很是有用的,例以下面的例子將會匹配 「GET /commits/71dbb9c」 一樣也會匹配 「GET /commits/71dbb9c..4c084f9″。
app.get(/^\/commits\/(\w+)(?:\..\..(\w+))?$/,function(req,res){ var from = req.params[0]; var to = req.params[1] || 'HEAD'; res.send('commit range ' + from + '...' + to); });
能夠傳遞一些回調,這對於複用一些加載資源、校驗中間件頗有做用
app.get('/user/:id',user.load,function(){ //...... });
若是你有衆多的中間件爲一個路由規則,你也可使用路由ap的all()。
var middleware = [loadForum,loadThread]; app.route('/forum/:fid/thread/:tid') .all(loadForum) .all(loadThread) .get(function(){ //.....}) .post(function(){//......})
全部的中間件規則將會被應用與GET 和 POST 請求。
app.all('*',requireAuthentication,loadUser);
app.all('*',requireAuthentication);
app.all('*',loadUser);
app.all('/api/*',requireAuthentication);
返回一個路由的實例而後能夠用於處理HTTP動做使用可選擇的中間件。使用app.route()是一個推薦的方法來避免重複命名路由規則以及由此帶來的錯誤。
var app = express(); app.route('/events') .all(function(req,res,next){ //runs for all HTTP verbs first //think of it as route specific middleware! }) .get(function(req,res,next){ res.json(......); }) .post(function(req,res,next){ //maybe add a new event.... });
應用程序的本地變量會被附加給全部在這個應用程序內渲染的模板。這是一個很是有用的模板函數,就像是應用程序級的數據同樣。
app.locals.title = "My App"; app.locals.strftime = require('strftime'); app.locals.emall = 'me@myapp.com';
app.locals對象是一個Javascript對象。添加到它的屬性,將會被當作局部變量在應用程序中被公開。
app.locals.title //=>'My App' app.locals.email // =>'me@myapp.com'
默認狀況下Express之有一個應用程序級的局部變量,那就是setting。
app.set('title','My App'); //use settings.title in a view
渲染 view,callback用來處理返回渲染後的字符串。這個是res.render()的應用程序級的版本,它們的行爲是同樣的。
app.render('email',function(err,html){ //....... }); app.render('email',{name:'Tobi'},function(err,html){ //....... })
在給定的主機和端口上監聽請求,這個和node的文檔http.Server#listen()是一致的
var express = require('express'); var app = express(); app.listen(3000);
經過express()返回的 app 事實上是一個Javascript函數,它被設計爲傳遞給node的http Server做爲處理請求的回調函數。因爲app並非經過HTTP或HTTPS繼承來的,它只是一個簡單的callback,因此這容許你很輕鬆的使用一樣的代來處理HTTP和HTTPS請求。
var express = require('express'); var https = require('https'); var http = require('http'); var app = express(); http.createServer(app).listen(80); https.createServer(options,app).listen(443);
app.listen()方法只是被定義爲一個簡單的方法,若是你但願是用HTTPS協議或者同時使用HTTP和HTTPS,可使用上面的技術。
app.listen = function(){ var server = http.createServer(this); return server.listen.apply(server,arguments); }
轉自:http://www.90it.net/expressjs-4-api-zh-cn-application.html