express创建项目
命令行下:
express prj_name
cd prj_name && npm install
ejs html
var ejs = require(‘ejs‘); //增加 app.set(‘views‘, path.join(__dirname, ‘public/views‘));//设置模板文件夹路径,可自己指定 app.engine(‘html‘,ejs.__express); //增加 app.set(‘view engine‘, ‘html‘);//设置使用的模板引擎
配置端口监听
app.set(‘env‘, process.env.NODE_ENV || ‘development‘); app.set(‘port‘, app.config.server.port || 3000);
解读app.js
require之后创建一个express应用程序:
var app = express();
这个可以留在app.js中
配置
// all environments app.set(‘port‘, process.env.PORT || 3000); app.set(‘views‘, __dirname + ‘/views‘); app.set(‘view engine‘, ‘jade‘); app.use(express.favicon()); app.use(express.logger(‘dev‘)); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.cookieParser(‘your secret here‘)); app.use(express.session()); app.use(app.router); app.use(require(‘less-middleware‘)({ src: __dirname + ‘/public‘ })); app.use(express.static(path.join(__dirname, ‘public‘))); // development only if (‘development‘ == app.get(‘env‘)) { app.use(express.errorHandler()); }
app.set
用来设置环境变量,第一个参数是环境变量的name,第二个参数是值;在其他需要访问环境变量的地方,可以用app.get
获取,比如上面的app.get(‘env‘)
。下面是一些内建Express环境变量:
env
运行时环境,默认为 process.env.NODE_ENV 或者 "development"trust proxy
激活反向代理,默认未激活状态jsonp callback name
修改默认?callback=的jsonp回调的名字json replacer
JSON replacer 替换时的回调, 默认为nulljson spaces
JSON 响应的空格数量,开发环境下是2 , 生产环境是0case sensitive routing
路由的大小写敏感, 默认是关闭状态, "/Foo" 和"/foo" 是一样的strict routing
路由的严格格式, 默认情况下 "/foo" 和 "/foo/" 是被同样对待的view cache
模板缓存,在生产环境中是默认开启的view engine
模板引擎views
模板的目录
我们用到了最后两个,设置了页面显示的模板引擎和保存模板的目录。
设置app.use([path], function)是指在访问前缀为path
的路径执行时中间函数function
,上面的代码中没有指定path
,则表示在访问默认前缀/
的路径时执行中间函数function
。比如上面代码中的
app.use(require(‘less-middleware‘)({ src: __dirname + ‘/public‘ })); app.use(express.static(path.join(__dirname, ‘public‘)));
在访问请求静态文件/stylesheets/style.css
时,就会先执行less-middleware,再执行express.static
,返回public/stylesheets/style.css
给浏览器端。
app.use()
的出场顺序非常重要,use的先后顺序决定了中间函数的优先级。 比如express.logger()
通常是第一个,可以记录全部请求。如果不想记录静态文件的请求,可以把less-middleware和 app.use(express.static)
放到logger
前面。
在express以前的版本中有个app.configure()方法,该方法虽然仍得以保留,但推荐使用if
代替:
if (‘development‘ == app.get(‘env‘))
因为以后还会有很多配置,所以我们要把这部分内容提取出来放到单独的文件中,创建/config/express.coffee
做这些配置,而在app.js中用require代替这部分代码:
require(‘./config/express‘)(app);
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
参数,比如:
<form action=‘/users/1‘> ... <input type="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没有出现,或被放在了它后面,那服务器每次遇到请求就会到硬盘上找有没有对应的静态文件,会造成性能下降
启动
文件最后的代码是启动服务器,并输出一段日志:
http.createServer(app).listen(app.get(‘port‘), function(){ console.log(‘server listening on port ‘ + app.get(‘port‘)); });
这个也要保留在app.js中