Node.js(三)——Express(http://www.expressjs.com/)
一、Express简介
1、web服务端框架
- express
- koa
- 阿里的egg框架
- 等等
Express 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架,它提供一系列强大的特性,帮助我们创建各种 Web 和移动设备应用。
2、Express安装(http://www.expressjs.com.cn/starter/installing.html)
- 安装node.js,接下来为应用创建一个目录,然后进入此目录并将其作为当前工作目录。(执行mkdir myapp和cd myapp两个命令)
- 通过npm init 命令为应用创建一个package.json 文件。(npm init)此命令将要求输入几个参数,可以直接按“回车”键接受默认设置即可,entry point: (index.js)这个除外,键入 app.js 或者所希望的名称,这是当前应用的入口文件。如果希望采用默认的 index.js 文件名,只需按“回车”键即可。
- 接下来安装 Express 并将其保存到依赖列表中(npm install express –save),如果只是临时安装 Express,不想将它添加到依赖列表中,只需略去 –save 参数即可
安装Node模块时,如果指定了 –save 参数,那么此模块将被添加到 package.json 文件中 dependencies 依赖列表中。 然后通过 npm install 命令即可自动安装依赖列表中所列出的所有模块。
3、Express入门程序初体验(http://www.expressjs.com.cn/starter/hello-world.html)
特别说明:这里所创建是一个最简单的 Express应用,并且仅仅只有一个文件,和通过Express应用生成器所创建的应用完全不一样,Express 应用生成器所创建的应用框架包含多个 JavaScript 文件、Jade 模板和针对不同用途的子目录。
- 步骤
- 1)进入 myapp 目录,创建一个名为 app.js 的文件
- 2)写入基本代码
- 3)控制台执行node app.js查看
app.js中的代码
var express = require('express');
var app = express();
app.get('/',function(req,res){
res.send('Hello World');
});
var server = app.listen(3000,function(){
var host = server.address().address;
var port = server.address().port;
console.log(host,port);
})
结果
4、Express脚手架(应用生成器)(http://www.expressjs.com.cn/starter/generator.html)
通过应用生成器工具,express可以快速创建一个应用的骨架。
- 步骤
- 1)全局安装express(npm install express-generator -g)
- 2)在当前工作目录下创建一个命名为myapp 的应用(express myapp)
- 3)切换到这个应用(cd myapp)
- 4)安装所有依赖的包(npm install)
- 5)启动这个应用(MacOS 或 Linux 平台下 DEBUG=myapp npm start)
- 6)启动这个应用(windows下 SET DEBUG=myapp:* & npm start)
- 7)打开myapp下面bin文件夹下面的www查看端口号port,然后在浏览器通过localhost:port查看,比如说我的端口号是3000,我就通过localhost:3000来查看,也可以自行修改
【4.1】Express的一些命令行
【4.2】通过express脚手架生成的结构
- 简单说明:
- app.js是入口文件,用来启动应用程序的包含应用程序的配置信息
- node-modules是用来保存在package.json中定义并且已经安装的node模块
- package.json提供应用程序的信息,包括运行程序所需安装的依赖模块
- public是将应用程序提供给web进行服务的公共文件夹,包括样式、js和图片等
- routes,路由
5、Express路由
【5.1】Express简单路由入门
二、中间件(http://www.expressjs.com.cn/guide/using-middleware.html)
1、简介
1)Express 是一个自身功能极简,完全是由路由和中间件构成一个的 web 开发框架。
2)从本质上来说,一个 Express应用就是在调用各种中间件。
3)中间件就是通过在客户和应用程序逻辑之间添加一个瘦层来过滤应用程序中的请求和响应的一种方式。
4)中间件(Middleware) 是一个函数,它可以访问请求对象(request object (req)), 响应对象(response object (res)), 和 web 应用中处于请求-响应循环流程中的中间件,一般被命名为 next 的变量。简单的说,一个中间件就是由请求对象、响应对象和next组成。
2、中间件的功能
- 执行任何代码
- 修改请求和响应对象
- 终结请求-响应循环
- 调用堆栈中的下一个中间件
注意:如果当前中间件没有终结请求-响应循环,则必须调用 next() 方法将控制权交给下一个中间件,否则请求就会挂起。
3、中间件分类
- 应用级中间件
- 路由级中间件
- 错误处理中间件
- 内置中间件
- 第三方中间件
4、中间件工作图示
5、应用级中间件
应用级中间件绑定到app对象使用app.use() 和app.METHOD(), 其中, METHOD 是需要处理的 HTTP 请求的方法,例如 GET, PUT, POST 等等,全部小写。
【5.1】例子:没有挂载路径的中间件,应用的每个请求都会执行该中间件
- 步骤
- 新建express项目站点
- 在app.js中使用app.use()将应用级中间件绑定到app对象
- 启动
app.js中的代码
app.use(function(req,res,next){
console.log('没有挂载路径的中间件,应用的每个请求都会执行该中间件');
next();
});
注意:参数说明:req->请求对象 res->响应对象 next->web应用中处于请求-响应循环流程中的中间件
在控制台启动查看结果
【5.2】例子:有挂载路径的中间件,比如挂载至 /user/:id 的中间件,任何指向 /user/:id 的请求都会执行它
app.js中的代码
app.use('/user/:id',function(req,res,next){
console.log('有挂载路径的中间件');
next();
})
在控制台启动查看结果
【5.3】例子:使用app.METHOD()将应用级中间件绑定到app对象,路由和句柄函数(中间件系统),处理指向 /user/:id 的method请求
app.js中的代码
app.get('/user/:id',function(req,res,next){
res.send(req.params.id);
})
特别注意:
如果app.use()内容中使用了console.log而没有使用next()方法将控制权交给下一个中间件,请求就会挂起
如果直接使用了res.send则终结请求-响应循环,不会再继续执行下面的中间件
【5.4】例子:在一个挂载点装载一组中间件
app.js中的代码
app.use('/user/:id',function(req,res,next){
console.log(req.params.id);
next();
},function(req,res,next){
console.log(req.method);
next();
})
在控制台启动查看结果
【5.5】例子:如果需要在中间件栈中跳过剩余中间件,调用 next(‘route’) 方法将控制权交给下一个路由。
next(‘route’) 只对使用 app.method() 或 router.method() 加载的中间件有效。
app.js中的代码
app.get('/user/:id', function (req, res, next) {
if (req.params.id == 0) next('route');
else next();
}, function (req, res, next) {
console.log('hi');
next();
});
app.get('/user/:id', function (req, res, next) {
console.log('hello');
next();
});
6、路由级中间件
路由级中间件和应用级中间件一样,只是它绑定的对象为 express.Router()。
var router = express.Router();
路由级使用 router.use() 或 router.VERB() 加载。
【6.1】例子:没有挂载路径的中间件,通过该路由的每个请求都会执行该中间件,其他的就不一一举例了
- 步骤
- 新建express项目站点
- 在router文件夹下面的js文件中使用router.use() 或 router.VERB() 加载
- 启动查看
router文件夹下面index.js中的代码
router.use(function(req,res,next){
console.log('Hello');
next();
})
注意:参数说明:req->请求对象 res->响应对象 next->web应用中处于请求-响应循环流程中的中间件
在控制台启动查看结果
【6.2】将路由挂载至应用
app.use(‘/’, router);
7、错误处理中间件
错误处理中间件有 4 个参数,定义错误处理中间件时必须使用这 4 个参数。即使不需要 next 对象,也必须在签名中声明它,否则中间件会被识别为一个常规中间件,不能处理错误。
错误处理中间件和其他中间件定义类似,只是要使用 4 个参数,而不是 3 个,其签名如下: (err, req, res, next)。
app.use(function(err, req, res, next) {
console.error(err);
res.status(500).send('error');
});