Express是什么

express 是一个快速,简单,极简的 node.js 应用开发框架,通过它,可以轻松构建各种 Web 应用(后端)。例如:

接口服务

传统的Web网站

开发工具集成

官网:​​http://expressjs.com​

GitHub:​​https://github.com/expressjs/express​

中文文档(非官方):​​https://www.expressjs.com.cn​


express 本身是极简的,仅提供了 web 开发的基础功能,但是它通过中间件的方式集成了许多外部插件来处理 http 请求。

body-parser:解析 http 请求体

compression:压缩 http 响应

cookie-parser:解析 cookie 数据

cors:处理跨域资源请求

morgan: http 请求日志记录

express 中间件的特性固然强大,让 express 本身变得灵活和简单,要那么多包组合在一起,也是件麻烦事;

express 不对 node.js 已有的特性进行二次抽象,只是在它之上扩展了 web 应用所需的基本功能。

内部使用的还是  http 模块

请求对象继承自: http.IncomingMessage

响应对象继承自:http.ServerResponse

express 特性

简单易学

丰富的基础 API 支持,以及常见的 HTTP 辅助程序,如:重定向、缓存等;

强大的路由功能;

灵活的中间件;

非常稳定且高性能;

视图系统支持14个以上的主流模板引擎;

express 应用场景

传统的 web 网站: Ghost ;

接口服务;

服务端渲染的中间层:对前端来说较好用;

开发工具: Json Server 、webpack-dev-server


Express 起步

使用 express 创建 web 服务,输出 hello world 响应内容;

专门为 express 创建一个目录(就叫 express),并初始化:

> npm init -y

安装

> npm install express

安装完后查看版本:

> npm list express

Express 简介、安装、使用和案例_Express

app.js

创建入口模块: app.js

const express = require('express')
const app = express()
app.get('/',(req,res)=>{
res.send('Hello World!')
})
app.listen(3000,()=>{
console.log(`Server is running ...`);
})

提示1:引入模块 express,创建实例,创建路由,设置响应,创建监听; 

启用服务:

> node app.js

或者使用全局 nodemon ,可以帮助我们自动重启服务;

​Nodemon 简介、安装、使用和配置​

> nodemon app.js

预览效果:

浏览器打开 localhost:3000/ 或 127.0.0.1:3000/ 

Express 简介、安装、使用和案例_Express_02


Express 路由

路由是指确定应用程序如何响应客户端对特定端点的请求,该特定端点是 URI(或路径)和特定的 HTTP 请求方法(GET,POST等)。

每个路由可以具有一个或多个处理程序函数,这些函数在匹配该路由时执行。

路由的定义

定义路由的语法:

app.METHOD(PATH,HANDLER)

app 是 Express 实例;

METHOD 是小写的 http 请求方法;

PATH : 是服务器上的路径;

HANDLER:是当路由匹配时执行的功能,就是路由处理函数;

简单示例

这里只写核心变动的代码,启动服务使用 nodemon ,测试工具使用 apifox;

1)在根路径响应 Hello World! :

app.get('/',(req,res)=>{
res.send('Hello World!')
})

这个已经体会过了;

2)在根路径响应 POST 请求:

app.post('/',(req,res)=>{
res.send('got a post request')
})

浏览器直接访问,永远是get请求,这里使用 Apifox 或 Postman 来测试 post 请求;

Express 简介、安装、使用和案例_Express_03

提示:请求方式使用 POST ,地址是  127.0.0.1:3000/ 或 localhost:3000/ 

提示:如果使用的是 GET 请求方式,那就是示例1展示的 Hello World了;

Express 简介、安装、使用和案例_Express_04

3)响应 /user 路径的PUT 请求:

app.put('/user',(req,res)=>{
res.send('got a PUT request at /user')
})

Express 简介、安装、使用和案例_Express_05

提示:路由的路径变成 /user 了,地址栏中也要对应;

Express 简介、安装、使用和案例_Express_06

4)响应对 /user 路由的 DELETE 请求:

app.delete('/user',(req,res)=>{
res.send('got a DELETE request at /user')
})

提示:代码的写法是类似的,只需把 put 改成 delete 就行了;


Express请求和响应

Express 应用使用路由回调函数的参数: request 和 response 对象来处理请求和响应的数据。

app.get('/',function(req,res){
// ...
})

req :处理请求相关的对象;

res :处理发送响应相关的对象;

Express 不对 node.js 已有的特性进行二次抽象,只是在它之上扩展了 web 应用所需要的基本功能;

内部使用的还是 http 模块;

请求对象继承自: http.IncomingMessage

响应对象继承自: http.ServerResponse

请求对象

req 对象代表 HTTP 请求,并具有请求查询字符串参数正文HTTP标头等的属性。名字这么写,只是为了方便理解,参数名是可以自定义的;

req 对象的属性是继承自 node.js 的 ​​http.IncomingMessage​​ 的,所以它有的,req 都可以使用,Express又扩展了一些特有属性;

http.IncomingMessage

Express 简介、安装、使用和案例_Express_07

输出一些从 node.js 中继承来的属性:

app.get('/id',(req,res)=>{
console.log(req.url); // 请求地址
console.log(req.method); // 请求方法
console.log(req.headers); // 请求头
res.send('Hello World!')
})

浏览器地址址栏:

Express 简介、安装、使用和案例_Express_08

看终端结果:

Express 简介、安装、使用和案例_Express_09

红框:分别代表 url 和 method 

黄框:请求头信息(图片只截取了一部分);


Express 的 request,封装了一些其他实用的属性

官网地址:​​http://expressjs.com/en/4x/api.html#req​

-- req.app:返回实例本身;

-- req.url:获取请求时的URL;

-- req.baseUrl 基础路由地址

-- req.body post发送的数据解析出来的对象

-- req.cookies 客户端发送的cookies数据

-- req.hostname 主机地址 去掉端口号

-- req.ip 查看客户端的ip地址

-- req.ips 代理的IP地址

-- req.originalUrl 对req.url的一个备份

-- req.params 在使用/:id/:name 匹配params

-- req.path 包含请求URL的路径部分

-- req.protocol http 或https协议

-- req.query 查询字符串解析出来的对象 username=zhangsan&password=123 { username:zhangsan }

-- req.route 当前匹配的路由 正则表达式

-- req.get 获取请求header里的参数

-- req.is 判断请求的是什么类型的文件

-- req.param(key名称) 用来获取某一个路由匹配的参数

输出一些常用的:

app.get('/id',(req,res)=>{
console.log(req.ip); // 请求地址
console.log(req.query); // 查询字符串解析出来的对象
console.log(req.protocol); // 获取 http 或https协议
res.send('Hello World!')
})

看下输出结果:

Express 简介、安装、使用和案例_Express_10

提示:分别是IP,参数对象和http;


响应对象

res 对象表示 Express 应用在收到 HTTP 请求时发送的 HTTP 响应。

res 对象继承自 ​​http.ServerResponse​​ 这个类

看下继承来的 HTTP响应的方法和属性:

-- res.statusCode  设置状态码;

-- res.end() 原生的结束响应;

app.get('/id',(req,res)=>{
res.statusCode = 201 // 设置响应码
res.end()
})

在 apifox 中执行一下:

Express 简介、安装、使用和案例_Express_11

看结果:

Express 简介、安装、使用和案例_Express_12

返回了状态码 201;


原生发送数据: res.write(),res.end()都可以;

-- res.write() 是发送数据;

app.get('/id',(req,res)=>{
res.write('a')
res.write('b')
res.write('c')
res.end()
// res.send('Hello World!')
})

在apifox 中执行:

Express 简介、安装、使用和案例_Express_13

看下结果:

Express 简介、安装、使用和案例_Express_14

也输出了  abc; 

-- res.end() 结束HTTP响应,同时也能发数据;

app.get('/id',(req,res)=>{
res.end("hello world")
})

再看下 Express 在响应对象中的扩展:

-- res.send([body])  扩展的发送数据方法;

The body parameter can be a Buffer object, a String, an object, Boolean, or an Array. 

body参数可以是Buffer对象、字符串、对象、布尔值或数组。

app.get('/id',(req,res)=>{
//res.send('hello world')
res.send({foo:'bar'})
})

结果:

Express 简介、安装、使用和案例_Express_15

链式调用:

app.get('/id',(req,res)=>{
//res.send('hello world')
//res.send({foo:'bar'})
res.status(200).send('ok')
})

发送状态码 200,响应字符串  ok; 


-- res.cookie(name, value [, options]) 设置和发送 cookie

app.get('/id',(req,res)=>{
res.cookie('foo','bar')
res.cookie('name','jacky')
res.status(200).send('ok')
})

设置 cookie ,原生是没有的,express 扩展了这个;