介绍
Express 是一个基于 node.js 的 Web应用开发框架。它提供了一组强大的特性,可以帮助开发人员快速构建高性能的 Web 应用和 API。
Express 的主要特性包括:
- 轻量级: 核心代码非常简洁,只有几百行,可以快速启动。
- 高度可扩展:提供了一系列的插件(称为中间件),可以轻松扩展功能。
- 强大的路由功能:提供了灵活的路由功能,可以为不同的请求指定不同的处理逻辑。
- 内置模板引擎:提供了对多种模板引擎的支持,可以轻松渲染动态 HTML 页面。
初体验
安装 Express
npm install express@4.17.1
导入 Express
const express = require("express")
创建 Web 服务器
const app = express()
定义 GET 路由
app.get('/',(req,res)=>{ res.send('GET响应内容') })
定义 POST 路由
app.post('/',(req,res)=>{ res.send('POST响应内容') })
启动服务器
app.listen(80,()=>{ console.log('服务已启动,服务器地址:http://localhost:80/') })
Express 对象
use
用于加载中间件,中间件是指在请求和响应对象之间运行的一些函数,用于处理 HTTP 请求并响应。
中间件
概念
- 中间件函数是运行在请求和响应之间的一些函数
- 一个请求中,所有中间件函数会共享同一份 req 和 res 对象
- 一个请求中,如果中间件函数不调用 next 函数向下调用其他中间件,则代表终止的处理链
- 注意事项
- 全局中间件必须在路由注册之前装载
- 中间件调用 next 向下传递后不要再处理任何数据,避免出现混乱
自定义中间件
全局中间件
app.use((rqe,res,next)=>{
console.log('中间件函数运行了')
next();
})
局部中间件
// 跳过express的导入以及express的实例创建...
// 定义中间件函数
const hand = (req,res,next)=>{ .... }
// 使用中间件函数
app.get('/',hand,(req,res)=>{ .... })
// 以数组的形式,传入多个中间件函数
app.get('/',[hand,hand],(req,res)=>{ .... })
// 以不定数量传参,传入多个中间件函数
app.get('/',hand,hand,(req,res)=>{ .... })
错误处理中间件
错误处理函数,通常使用
app.use
进行注册,它的作用是捕获应用程序在处理过程中出现错误,防止进程崩溃。
Express 中间件是按顺序执行的,应该在所有其他中间件被定义后,再定义错误处理中间件。
Express 中的错误处理中间件 - 简书 (jianshu.com)
app.use((err,req,res,next)=>{ ... })
express.static
用于指定一个目录作为网站的静态资源,供用户访问
可以指定多个静态资源文件夹,优先级取决于指定的顺序
// 设置静态资源
app.use(express.static("clock"))
// 设置静态资源 ,指定前缀,组成地址:http://localhost/files/相关静态资源
app.use('/files', express.static('files'))
express.Router
用于创建一个独立的路由处理器,每个路由处理器可以用于管理不同的路由。
通过 Router 对象,可以轻松将一个大型的应用程序拆分成多个小的模块。
----------- baseRouter.js -----------
const express = require("express")
const router= express.Router()
// 注册路由
router.get('/',(req,res)=>{ ... })
// 导出路由对象
module.exports = router
----------- app.js -----------
const express = require('express')
const app = express() //创建服务器
const baseRouter = require('./baseRouter.js') //导入路由模块
app.use(baseRouter) // 以使用中间件的方式,注册路由模块
app.listen(80,()=>{ ... })
express.json
用于处理 JSON 数据,JSON 数据会被自动解析并存放到
req.body
对象
app.use(express.json())
express.urlencoded
用于处理
x-www-form-urlencoded
数据,表单数据会被自动解析并存放到req.body
对象
app.use(express.urlencoded())
urlencoded
的options.extend
设置为假时,默认使用 JavaScript 的原生解析 querystring 模块,它无法解析嵌套数据urlencoded
的options.extend
设置为真或不设置时,默认使用的是第三方 qs 模块。
express.text
用于接收
text/plain
的文本数据,存放在req.body
express.raw
用于接收
buffer
的字节数据,存放在req.body
Request 对象
query
存放着当前请求地址的查询参数
地址:http://localhost/user?arg=test
console.log(req.query) // { arg: 'test' }
params
存放着当前请求地址的动态参数
定义动态路由
推荐配合动态路由使用 RESTful API架构
app.get('/user/:id',(req,res)=>{ console.log(req.params.id) })
假设访问 http://localhost/user/123456
,那么动态参数会存在一个 id,且值为 123456
console.log(req.params) // { id: '123456' }
console.log(req.params.id) // 123456
第三方中间件
Cors
使用后允许接口被跨域访问
安装
npm install cors
使用
const cors = require("cors")
app.use(cors())
express-session
一个基于 Express 的 Session 中间件,会自动维护每个请求的会话状态
安装
npm install express-session
使用
const session = require("express-session")
app.use(session({
name:"会话名称",
secret:"加密密钥",
resave:false,// 固定写法,不需要强制保存
saveUninitialized:false,// 固定写法,不需要未初始化时强制保存
}))
- 在使用
express-session
中间件后,会在请求对象(req)上添加一个 session 属性,用于存储当前会话的状态 req.session
可以在同一个用户的请求中, 管理这个用户的相关数据.
express-jwt
一个基于 Express 的用于 JWT 鉴权的中间件,需要配合
jsonwebtoken
模块使用。
安装
npm install express-jwt jsonwebtoken
使用
const { expressjwt } = require("express-jwt")
const jwt = require("jsonwebtoken")
const secretKey = 'Test' // 加解密钥
// jwt 计算方式
jwt.sign(content,secretKey,{ expiresIn: '30d' }) // expiresIn 定义到期时间
// 注册鉴权中间件
app.use(expressjwt({
secret: secretKey, //设置密钥
algorithms: ['HS256'] //设置加密方式
}).unless({'path': "/login"}) //unless指定免验证的接口
)
// 测试路由
app.get("/profile", (req, res) => {
console.log(req.auth) // 旧版express-jwt存放在req.user,最新版迁移到了req.auth,更加语义化了。
res.send('通过验证')
})
escook/express-joi
用于校验表单数据的合法性 NPM文档
express-validator
用于校验表单数据的合法性