初始Express
基础概念
Express 是基于Node.js平台 快速、开放、极简的Web开发框架
通俗的理解:express 的作用和Node.js 内置的http模块类似,是专门用来创建Web服务器的
Express的本质 就是一个npm 上的第三方包 提供了快速创建web服务器的便捷方法
官网:https://www.expressjs.com.cn/
Express 是基于内置的http模块进一步封装出来的,能够极大的提高开发效率
-
Web网站服务器:专门对外提供Web 网页资源的服务器
-
API接口服务器:专门对外提供API接口的服务器
可以快速创建Web网站的服务器或API接口服务器
安装与创建服务器
安装express npm i express@4.17.1
const express = require('express')
//创建web服务器
const app = express()
app.listen(80, () => {
console.log('express server running at http://127.0.0.1')
})
监听GET/POST 请求并响应
// 参数1: 客户端请求的url地址
// 参数2: 请求对应的处理函数
// req: 请求对象(与请求相关的属性与方法)
// res: 响应对象(与响应相关的属性与方法)
app.get('请求url', function(req, res) {/* 处理函数*/})
app.post('请求url', function(req, res) {
//通过 res.send 方法响应客户端
res.send('请求成功')
})
获取url中携带的查询参数
可以通过 req.query 对象 访问到 req.query默认是一个空对象
app.get('/', (req, res) => {
// req.query 默认是一个空对象
// 客户端使用 ?name=zs&age=20 这种查询字符串形式,发送到服务器的参数
// 可以通过 req.query 对象 访问到
// req.query.name req.query.age
console.log(req.query)
})
获取url中的动态参数
通过 req.params 对象 可以访问到URL 中,通过:匹配的动态参数
// URL 地址中 可以通过:参数名的形式 匹配动态参数值
app.get('/user/:id/:name', (req, res) => {
//req.params 默认是一个空对象
// 里面存放着通过: 动态匹配到的参数值
console.log(req.params)
})
托管静态资源
express 提供了一个非常好用的函数 叫做 express.static() ,可以非常方便的创建一个静态资源服务器,例如 通过以下代码就可以将public 目录下的图片、css文件、javaScript 文件对外开放访问了
app.use(express.static('public'))
// 若要托管多个目录 多次调用 express.static()函数
⚠️注意 Express 在指定的静态目录中查找文件,并对外提供资源访问路径。因此 存放静态文件的目录名不会出现在URL中
http://localhost:8080/images/dd.jpg
http://localhost:8080/cdd/style.css
挂载路径前缀
如果希望在托管的静态资源访问路径之前 挂载路径前缀
app.use('/public', express.static('public'))
http://localhost:8080/public/images/dd.jpg
安装使用nodemon
使用nodemon 工具监听项目文件变动,自动重启项目
npm install -g nodemon
使用nodemon app.js
来启动项目,好处:代码修改之后会被nodemon监听到,从而实现自动重启项目的效果
路由/express 中的路由
Express 路由:客户端的请求与服务器处理函数之间的映射关系
express 路由3部分组成、请求的类型、请求的url地址、处理函数
app.METHOD(PATH, HANDLER)
//eg
app.get('/', function(req, res) {
res.send('Hello world')
})
路由的匹配过程
每当一个请求到服务器之后,需要先经过路由匹配,,只有匹配成功后,才会调用对应的处理函数
如果请求类型和请求的url同时匹配成功,则 express 会将这次请求转交给对应的function函数进行处理
⚠️注意点 按照定义的先后顺序进行匹配、请求类型和请求的url同时匹配成功才会调用对应的处理函数
用法
把路由挂载到app上,示例代码
const express = require('express')
const app = express()
//挂载
app.get('/', (rea, res) => {
res.send('Hello World.')
})
app.post('/', (rea, res) => {
res.send('post request')
})
app.listen(80, () => {
console.log('server running http://127.0.0.1')
})
模块化路由
方便对路由进行模块化的管理,将路由单独抽离为模块
步骤
- 创建路由对应的.js文件
- 调用
express.Router()
函数创建路由对象 - 向路由对象上挂载具体的路由
- 使用
module.exports
向外共享路由对象 - 使用
app.use()
函数注册路由模块
var express = require('express')
var router = express.Router()
router.get('/user/list', function () {
res.sen('Get user list')
})
module.exports = router
-------------------------------
//注册 路由
const router = require('./router')
app.use(router)//注册全局中间件
//也可以路由添加前缀
//app.use('/api', router)
Express-中间件
中间件介绍
中间件:(Middleware),特指的业务流程的中间处理环节
中间件调用流程:当一个请求到达Express的服务器之后,可以连续调用多个中间件,从而对这次请求进行预处理
Express中的中间件
本质是一个function处理函数,Express中间件格式如下
⚠️注意:中间件函数的形参列表中,必须包含next 参数,而路由处理函数中只包含req和res
next函数作用
实现多个中间件连续调用的关键,把流转关系转交给下一个中间件或者路由
定义中间件函数
const mv = function() {
console.log('这是一个最简单的中间件函数')
//在当前中间件的业务处理完毕之后 必须调用 next() 函数
//表示把流转关系交给下一个中间件或者路由
next()
}
使用 app.use(mv) 将mv注册为全局生效的中间件(指客户端发起任何请求到达服务器之后都会触发的中间件)
中间件的作用
多个中间件共享同一份 req 和 res ,我们可以在上游的中间件,统一为req或者res 对象添加自定义属性或者方法,供下游中间件或者路由使用
使用app.use() 连续定义多个全局中间件。客户端请求到达服务器之后,会按照中间件定义的先后顺序依次进行调用
局部生效的中间件
不使用app.use() 定义的中间件叫做局部生效的中间件
const mv1 = function(req,res,next) {
console.log('中间件mv1')
next()
}
//mv1这个中间件只在当前路由中生效 这种用法 属于局部生效的中间件
app.get('/',mv1,function(req,res) {
res.send('page')
})
app.get('/user', funtion(req,res) {
res.send('User page')
})
定义多个局部中间件
app.get('/', mw1, mw2, (req, res) => {
res.send('page')
})
app.get('/', [mv1, mv2], (req, res) => {
res.send('page')
})
注意
⚠️注意事项
一定要在路由之前定义中间件
客户端发送过来的请求可以连续调用多个中间件进行处理
执行完中间件的业务代码后 ,不要忘记调用next()
防止代码逻辑混乱,调用next() 之后 不要再写额外代码
连续调用多个中间件时,多个中间件之间,共享req和res对象
中间件的分类
- 应用级别的中间件
- 路由级别的中间件
- 错误级别的中间件
- Express 内置的中间件
- 第三方中间件