http://www.expressjs.com.cn/4x/api.html 中文手册
Express介绍与安装
1.1 Express介绍
Express 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架,它提供一系列强大的特性,帮助你创建各种 Web 和移动设备应用。 Express 含有丰富的 HTTP api和任意排列组合的 Connect 中间件,让你创建健壮、友好的 API 变得既快速又简单。 Express 不对 Node.js 已有的特性进行二次抽象,我们只是在它之上扩展了 Web 应用所需的基本功能。
1.2 版本
Express 4.x 较 Express 3.x 进行了较大的改动,原来基于 Express 3.x 的项目无法直接升级到 4.x。
1.2.1 Express 4.x的主要变化
重新撰写Express内核,取消了原来对于Connect的依赖
移除了大部分Build-in的Middleware
Middleware可以仅对特定url前缀的请求执行,并且支持url中的参数
对Routing系统的扩展
1.2.2 取消Connect的依赖
Express 3.x是基于 Connect 构建的。重构后的 Express 4.x取消了对 Connect 的依赖,变成了完全独立的模块。但由于采用一致的 Middleware 处理方法,新的 Express 4.x仍然对 Connect 的所有 Middleware 向下兼容,所以在 Express 中仍然可以使用 Connect 的 Middleware。
1.2.3 移除绝大多数Build-in的Middleware
Express 4.x的理念是仅专注于最核心的 routing 功能,而将其他组建的选择全部交由用户配置,一方面提供更好的灵活和定制性,另一方面可以始终让用户使用最新的 Middleware 而将其和 Express 的更新独立开来。其核心中仅保留了 express.static,其余 Middleware 均需要通过 npm 安装并且 require。下表中是主要移除的模块列表:
1.2.4 限定url前缀执行的Middleware
app.use(’/users/:id’, function(req, res, next) {
console.log(‘ID:’, req.params.id);
next();
})
‘/users/:id’ 被视作请求 url 的前缀,凡是以此前缀的请求(例如:’/users/yeelan0319/daily’)等等均会经过这个 Middleware 的处理。(与 Route 中的 url 不同,route 中必须完全匹配)。
注:此时得到的 req.path 是除去前缀后的内容。
1.2.5 Routing系统的扩展
Express 自动引用 Router Middleware。
原本在 Express 3.x中需要app.use(app.router),而无关于 app.get() 等定义的位置,这造成了一定的混乱。4中彻底取消了上述命令的引用,严格按照定义的顺序执行 use,get 或者其他的 http 请求。
app.route()
app.route() 方法更好的支持了 REST 风格的接口,减少了输入错误的风险,增强代码可读性。不得不说是非常美丽的一个解决方案!
app.route('/book')
.get(function(req, res) {
res.send('Get a random book');
})
.post(function(req, res) {
res.send('Add a book');
})
.put(function(req, res) {
res.send('Update the book');
})
express.Router
express.Router 是一个完整的具有 Middleware 和路由 Routing 的对象。通过
var router = require(‘express’).Router()
实例化后,可以使用 router.use() 和 router.get() 等方法,定义一个完整的 Node 模块,再将 router exports 出去。这样实质上是定义了一个大的应用中的“微型应用”。
1.2.6 Express 4.x迁移总结
安装对应的 Middleware。注意即使是上表中的对应也仅应当作为参考,因为有可能由于Middleware的升级而导致参数和返回值的变化,切忌盲目的直接安装并应用到生产环境中。
不需要再使用HTTP.createServer()方法,同时也不要require http模块了
不需要再使用app.use(app.router),将原本放在这句命令以下的Middleware移至get/post等HTTP verb的后面
重新安装express generator
1.3 安装方式
npm 本地安装 express 命令:
$ mkdir myExpressPro
$ cd myExpressPro
$ npm init -y
$ npm i -S express
npm 全局安装 express 命令:
$ npm install express-generator -g
1.4 安装确认
在 git-bash 命令行工具中输入 “express -v” 命令,如果全局安装成功,将显示如下信息:
$ express -v
Usage: express [options] [dir]
Options:
--version output the version number
-e, --ejs add ejs engine support
--pug add pug engine support
--hbs add handlebars engine support
-H, --hogan add hogan.js engine support
-v, --view add view support (dust|ejs|hbs|hjs|jade|pug|twig|vash) (defaults to jade)
--no-view use static html instead of view engine
-c, --css add stylesheet support (less|stylus|compass|sass) (defaults to plain css)
--git add .gitignore
-f, --force force on non-empty directory
-h, --help output usage information
error: option `-v, --view ' argument missing
Express路由
2.1 Express路由介绍
路由是指如何定义应用的端点(URIs)以及如何响应客户端的请求。
路由是由一个 URI、HTTP 请求(GET、POST等)和若干个句柄组成,它的结构如下: app.METHOD(path, [callback…], callback), app 是 express 对象的一个实例, METHOD 是一个 HTTP 请求方法, path 是服务器上的路径, callback 是当路由匹配时要执行的函数。
2.2 GET
一般情况下,我们获取数据用 get 请求,express 的 get 请求实现方式如下:
const express = require('express');
const app = express();
app.get('/', function(req, res) {
res.send('hello world'); //针对该get请求返回“hello world”
});
2.3 POST设置
通常情况下,我们提交数据用 post 请求,express 的 post 请求实现方式如下:
const express = require('express');
const app = express();
app.post('/', function(req, res) {
res.send('POST request to the testPage.'); //针对该post请求返回“POST request to the testPage.”
});
3. Express请求对象
3.1 Express请求对象request是什么?
Req 对象表示 HTTP 请求,并具有请求查询字符串、参数、体、HTTP 标头等的属性。在这个文档和约定中,对象总是被称为 REQ(HTTP 响应是 RES),但是它的实际名称是由您正在工作的回调函数的参数决定的。
3.2 request可以干什么?
通过 req 我们可以拿到任何从前端发送过来的请求信息,比如 url。
app.get('/index', (req, res) => {
console.log(req.url); //这里将输出前端发送过来的url信息
res.send('This is index get request.')
})
Express响应对象
4.1 Express请求对象response是什么?
RES 对象表示当 HTTP 请求收到 HTTP 请求时发送的 HTTP 响应。 在这个文档和约定中,对象总是被称为 RES(HTTP 请求是 REQ),但是它的实际名称是由您正在工作的回调函数的参数决定的。
4.2 response通常用来干什么?
res 对象是我们通过前端发过来的请求信息所做的响应,也就是发送信息给前端的。例如:
//发送字符串
app.get('/index', (req, res) => {
res.send('This is index get request.') //这里发送一个字符串给前端
})
//发送json格式数据
app.get('/index', (req, res) => {
res.json({name:'loushengyue',age:30}) //这里发送一个json对象给前端
})
//发送jsonp数据格式给前端
app.get('/index', (req, res) => {
res.jsonp({name:'loushengyue',age:30}) //这里发送一个jsonp对象给前端
})
中间件
5.1 Express中间件介绍
Express 是一个自身功能极简,完全是由路由和中间件构成一个的 web 开发框架:从本质上来说,一个 Express 应用就是在调用各种中间件。
中间件(Middleware) 是一个函数,它可以访问请求对象(request object (req)), 响应对象(response object (res)), 和 web 应用中处于请求-响应循环流程中的中间件,一般被命名为 next 的变量。
中间件的功能包括:
执行任何代码。
修改请求和响应对象。
终结请求-响应循环。
调用堆栈中的下一个中间件。
如果当前中间件没有终结请求-响应循环,则必须调用 next() 方法将控制权交给下一个中间件,否则请求就会挂起。
5.2 应用级中间件
应用级中间件绑定到 app 对象 使用 app.use() 和 app.METHOD(), 其中, METHOD 是需要处理的 HTTP 请求的方法,例如 GET, PUT, POST 等等,全部小写。例如:
var app = express();
// 没有挂载路径的中间件,应用的每个请求都会执行该中间件
app.use(function (req, res, next) {
console.log('Time:', Date.now());
next();
});
// 挂载至 /user/:id 的中间件,任何指向 /user/:id 的请求都会执行它
app.use('/user/:id', function (req, res, next) {
console.log('Request Type:', req.method);
next();
});
// 路由和句柄函数(中间件系统),处理指向 /user/:id 的 GET 请求
app.get('/user/:id', function (req, res, next) {
res.send('USER');
});
5.3 路由级中间件
路由级中间件和应用级中间件一样,只是它绑定的对象为 express.Router()。路由级使用 router.use() 或 router.VERB() 加载。上述在应用级创建的中间件系统,可通过如下代码改写为路由级:
var app = express();
var router = express.Router();
// 没有挂载路径的中间件,通过该路由的每个请求都会执行该中间件.
router.use(function (req, res, next) {
console.log('Time:', Date.now());
next();
});
// 一个中间件栈,显示任何指向 /user/:id 的 HTTP 请求的信息
router.use('/user/:id', function (req, res, next) {
console.log('Request URL:', req.originalUrl);
next();
}, function (req, res, next) {
console.log('Request Type:', req.method);
next();
});
// 一个中间件栈,处理指向 /user/:id 的 GET 请求
router.get('/user/:id', function (req, res, next) {
// 如果 user id 为 0, 跳到下一个路由
if (req.params.id == 0) next('route');
// 负责将控制权交给栈中下一个中间件
else next(); //
}, function (req, res, next) {
// 渲染常规页面
res.render('regular');
});
// 处理 /user/:id, 渲染一个特殊页面
router.get('/user/:id', function (req, res, next) {
console.log(req.params.id);
res.render('special');
});
// 将路由挂载至应用
app.use('/', router);
5.4 错误处理中间件
注意: 错误处理中间件有 4 个参数,定义错误处理中间件时必须使用这 4 个参数。即使不需要 next 对象,也必须在签名中声明它,否则中间件会被识别为一个常规中间件,不能处理错误。 错误处理中间件和其他中间件定义类似,只是要使用 4 个参数,而不是 3 个,如下: (err, req, res, next)。
app.use(function (err, req, res, next) {
console.error(err.stack);
res.status(500).send('Something broke!');
});