express是Node.js上最流行的Web开发框架,使用它可以快速的开发一个 Web 应用。
安装Express 在命令行工具中下载Express
1 $ npm install -g express-generator
新建工程 1 2 $ express -e blog $ cd blog && npm install
启动项目 1 DEBUG=blog node ./bin/www
工程结构 1 2 3 4 5 6 7 - app.js # 启动文件 - bin/ # 存储工程信息及模块依赖 - node_modules/ # 存放package.json中安装的模块,添加依赖的模块并安装后,存放在这个文件夹下 - package.json # 存放image、css、js等文件 - public # 存放路由文件 - routes # 存放视图文件 - views # 存放可执行文件
分析app.js 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 var app = express (); app.set ('views' ,path.join (__dirname,'views' )); app.set ('view engine' ,'ejs' ); app.use (logger ('dev' )); app.use (bodyParser.json ()); app.use (bodyParser.urlencoded ({extended :false })); app.use (cookieParser ()); app.use (express.static (path.join (__dirname,'public' ))); app.use ('/' ,routes); app.use ('/users' ,users); app.use (function (req,res,next ){ var err = new Error ('Not Found' ); err.status = 404 ; next (err); }); if (app.get ('env' ) === 'development' ) { app.use (function (err,req,res,next ){ res.status (err.status || 500 ); res.render ('error' ,{ message :err.message , error :err }) }) } app.use (function (err,req,res,next ){ res.status (err,status||500 ); res.render ('err' ,{ message :err.message , error :{} }); }); module .exports = app;
bin/www文件 1 2 3 4 5 6 7 8 9 # ! /usr/ bin/env node var debug = require ('debug' )('blog' ) var app = require ('../app' ); app.set ('port' ,process.env .PORT || 3000 ); var server = app.listen (app.get ('port' ),function ( ){ debug ('Express server listening on port ' + server.address ().port ); });
routes/index.js 1 2 3 4 5 6 7 8 var express = require ('express' );var router = express.Router ();router.get ('/' ,function (req,res ){ res.render ('index' ,{title :'Express' }); }) module .exports = router;
views/index.ejs 1 2 3 4 5 6 7 8 9 10 11 <!DOCTYPE html > <html > <head > <title > <%= title %></title > <link rel ='stylesheet' href ='/stylesheets/style.css' /> </head > <body > <h1 > <%= title %></h1 > <p > Welcome to <%= title %></p > </body > </html >
渲染模板时,传入的title值为Express字符串,模板引擎会将所有<%= title %>替换为express
路由控制 在routes/index.js中
1 2 3 router.get ('/' ,function (req,res ){ res.render ('index' ,{title :'Express' }); });
index.js问价就是用于管理app的路由,简单的路由分配 为了实现路由的统一管理,可以把所有路由控制器和实现路由功能的函数都放在index.js里
1 2 3 4 5 6 7 8 9 var routes = reuire ('./routes/index' );routes (app);app.listen (app.get ('port' ), function ( ) { console .log ('Express server listening on port ' + app.get ('port' )); });
1 2 3 4 5 module .exports = function (app ) { app.get ('/' ,function (req,res ){ res.render ('index' ,{title :'Express' }); }); };
路由规则 express封装了多种http请求方式,主要使用get和post两种,即app.get()和app.post() 这两个函数第一个参数都为请求的路径,第二个参数为处理请求的回调函数,回调函数的两个参数分别是req和res,表示请求信息和响应信息 路径请求及对应的获取路径有以下几种形式
req.query 处理GET请求,获取GET请求参数
1 2 3 4 5 6 req.query .q req.query .order req.query .shoe .color req.query .shoe .type
req.body 获取post请求,获取post请求
1 2 3 req.body .user .name req.body .user .email
req.params 处理/:xxx形式的get或post请求,获取请求参数
1 2 3 4 req.params .name req.params [0 ]
req.param(name) 处理get和post请求,但查找的优先级由高到低为req.parms->req.body->req.query
1 2 3 4 5 6 req.param ('name' ) req.param ('name' ) req.param ('name' )
添加路由规则 修改index.js,在app.get(‘/‘)函数后添加一条路由规则
1 app.get ('/new' ,function (req,re ))