上一节讲到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的使用。