上一節講到app.js中有一段代碼用app.set
和app.use
對express進行配置,但這些配置都是什麼意思,以及都能作哪些配置並無展開。這一節就專門來說express的配置。上節已經介紹了幾個設置,接下來先介紹剩下的幾個:javascript
app.use(express.favicon()); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.cookieParser('your secret here')); app.use(express.session()); app.use(app.router);
express.favicon(iconPath)
:用來設置網站的圖標,參數爲圖標的路徑。若是不指明,則用默認的express圖標。能夠修改成:css
app.use(express.favicon(path.join(__dirname,'../public/img/favicon.ico')))
express.bodyParser()
: 對請求內容進行解析,支持json、 application/x-www-form-urlencoded、multipart/form-data 格式數據的解析。也就是說ajax和form發送請求時,都會通過它的處理,方便在req中獲取相應的請求值。在express中處理文件上傳也是用它,能夠給出參數指明上傳文件存放的路徑,好比:html
app.use(express.bodyParser({uploadDir:'./uploads'}))
express.methodOverride()
:爲了支持put、delete等HTTP方法,不過要客戶端配合,包含相應的_method
參數,好比:java
<formaction='/users/1'> ... <inputtype="hidden"name="_method"value="put"/></form>
能夠對應到:node
app.put('/users/:id', users.put)
app.use(express.cookieParser('your secret here'));
和app.use(express.session());
:是爲了支持session,在這樣的設置中,session會被加密保存在客戶端的cookie,但這樣程序重啓後session就不起做用了,不過express.session支持session的持久化保存,由於express用的最多的數據庫就是mongo,因此下面給出用mongo保存session的配置。首先要在package.json里加上依賴項connect-mongo
:git
"connect-mongo":"0.3.3"
而後在config/express.coffee中引入connect-mongo,並修改express.session的設置:github
mongoStore =require('connect-mongo')(express) app.use express.session secret:'1234567890' store:new mongoStore url: config.db, collection :'sessions'
app.router
是connect router的增強版,用來處理app.get
,app.post
等請求處理設置,在瀏覽器訪問這些設置中對應的url時,express.router
會調用相應的function。若是不顯式調用app.use(app.router)
,express會在第一次碰到app.get(...)
之類的設置時隱含調用,因此這個能夠不用出如今配置項裏,但.use
的順序很關鍵,因此顯式調用比較好。好比在use
中出現app.use(express.static(path.join(__dirname, 'public')));
時,若是router沒有出現,或被放在了它後面,那服務器每次遇到請求就會到硬盤上找有沒有對應的靜態文件,會形成性能降低。web
這些是express最基本的配置項,其餘經常使用的配置項,好比壓縮、數據校驗、認證和受權等均可以放在這裏,下節繼續介紹。ajax
前面對express配置的介紹都是基於它所生成的app.js文件,如今去翻翻express的API文檔,看看還有什麼。數據庫
express把API分紅了四部分:Application、request、response、middleware。這四部分是express的關注點,其中最重要的是request
和response
兩部分,和大多數web框架同樣。
在application部分中,跟配置相關的set
,get
和use
前面介紹過了,還有一個很重要的:
app.locals:這是一個函數對象,能夠給它增長新的屬性。程序內全部頁面模板都能訪問這個對象,因此能夠用它保存全局配置變量供頁面模板使用。
默認狀況下express只有一個應用級變量,便可以由set()
設置的settings
,好比:
app.set('title','NodeCoffee');#在view裏使用 settings.title
app.locals
能夠有幾種不一樣的用法。能夠直接增長屬性賦值:
app.locals.title ='NodeCoffee'
也能夠調用方法直接傳入一個對象:
app.locals( title:'NodeCoffee' phone:'1150-858-9990' email:'me@nodecoffee.com')
由於在javascript的函數式編程特性,因此也能夠把函數傳到模板中使用,好比:
app.locals._ =require"underscore"
在request部分,沒有配置項,真沒有。
在response部分,有一個跟app.locals
對應的res.locals
。res.locals
用於保存請求級變量,它的用法跟app.locals
同樣,好比剛纔的title
等變量也能夠放在res.locals
中,但不能直接在配置中賦值,要用app.use
以middleware的方式設置。好比middleware view-helpers就是用res.locals
保存請求級變量,其中部分代碼以下:
res.locals.appName = name ||'App' res.locals.title = name ||'App' res.locals.req = req res.locals.isActive =function(link){return req.url.indexOf(link)!==-1?'active':''} res.locals.formatDate = formatDate res.locals.stripScript = stripScript res.locals.createPagination = createPagination(req)
其中的formatDate
、stripScript
和createPagination
都是它定義的函數,要在view中使用。
middleware是express重要的請求處理機制,在express的配置中能夠經過.use()
讓多個middleware構成請求的處理鏈,除了express提供的middleware,還有不少第三方middleware,好比上文提到的view-helpers,還有用於用戶驗證的passport等。咱們先來介紹兩個express的middleware:
express.compress()
:經過gzip / deflate壓縮響應數據. 這個中間件應該放置在全部的中間件最前面以保證全部的返回都是被壓縮的。不過也能夠只對文本內容進行壓縮,好比:
app.use express.compress filter:(req, res)->return/json|text|javascript|css/.test(res.getHeader('Content-Type')) level:9
express.csrf()
:這是爲防禦CSRF攻擊的middleware,服務器會爲每一個用戶產生一個惟一的"_csrf"標識,保存在用戶的session中,對於那些須要服務器更改的請求,服務器會對req.session._csrf
屬性進行校驗,若是客戶端發過來的這個屬性與保存在session中的值一致,則經過,不然返回304響應。
它須要session支持,所以應該放在.use(express.session())
以後。
以上是express自帶的middleware,此外咱們還要再介紹兩個經常使用的第三方middleware。第一個是用於輸入數據校驗的express-validator,另外一個是用於用戶驗證的passport。
express-validator是第三方middleware,因此要使用它須要先在package.json中加入依賴項:
"express-validator":"0.8.0"
而後在config/express.coffee中引入,配置以下:
expressValidator =require('express-validator') app.use(expressValidator( errorFormatter:(param, msg, value)->namespace= param.split('.') root =namespace.shift() formParam = root while(namespace.length) formParam +='['+namespace.shift()+']' param : formParam msg : msg value : value ))
express-validator的配置要放在express.bodyParser
以後,至於這個validator如何使用,將在controller中介紹。
passport的配置稍微複雜一點,這裏不展開講它的所有配置,只介紹做爲middleware在express中的設置。只須要兩行代碼:
app.use passport.initialize() app.use passport.session()
第一行是passport的初始化,第二行是爲了配合在session中保存驗證侯的用戶信息。下一節會以用戶註冊及登陸爲例介紹如何編寫express web程序,還會詳細講解passport的使用。