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 <engine> add view <engine> support (dust|ejs|hbs|hjs|jade|pug|twig|vash) (defaults to jade)
--no-view use static html instead of view engine
-c, --css <engine> add stylesheet <engine> 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 <engine>' 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!');
});