上一节讲到app.js中有一段代码用app.set
和app.use
对express进行配置,但这些配置都是什么意思,以及都能做哪些配置并没有展开。这一节就专门来讲express的配置。上节已经介绍了几个设置,接下来先介绍剩下的几个:
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图标。可以修改为:
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中处理文件上传也是用它,可以给出参数指明上传文件存放的路径,比如:
app.use(express.bodyParser({uploadDir:'./uploads'}))
express.methodOverride()
:为了支持put、delete等HTTP方法,不过要客户端配合,包含相应的_method
参数,比如:
<formaction='/users/1'> ...
<inputtype="hidden"name="_method"value="put"/></form>
可以对应到:
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
:
"connect-mongo":"0.3.3"
然后在config/express.coffee中引入connect-mongo,并修改express.session的设置:
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没有出现,或被放在了它后面,那服务器每次遇到请求就会到硬盘上找有没有对应的静态文件,会造成性能下降。
这些是express最基本的配置项,其他常用的配置项,比如压缩、数据校验、认证和授权等都可以放在这里,下节继续介绍。
前面对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的使用。