路由模块创建
// 这是路由模块
// 1. 导入 express
const express = require('express')
// 2. 创建路由对象
const router = express.Router()
// 3. 挂载具体的路由
router.get('/user/list', (req, res) => {
res.send('Get user list.')
})
router.post('/user/add', (req, res) => {
res.send('Add new user.')
})
// 4. 向外导出路由对象
module.exports = router
使用
const express = require('express')
const app = express()
// app.use('/files', express.static('./files'))
// 1. 导入路由模块
const router = require('./03.router')
// 2. 注册路由模块
app.use('/api', router) /api为路由前缀可无 访问时 http://127.0.0.1/api 才可访问
// 注意: app.use() 函数的作用,就是来注册全局中间件
app.listen(80, () => {
console.log('http://127.0.0.1')
})
中间件
定义中间件
const express = require('express') //导入express模块
const app = express()//创建web服务器
// 定义一个最简单的中间件函数
const mw = function (req, res, next) {
console.log('这是最简单的中间件函数')
// 把流转关系,转交给下一个中间件或路由
next()
}
app.use(mw)
//简化版中间件函数
app.use((req, res, next) => {
req.time=new Date() // 为 req 对象,挂载自定义属性,从而把时间共享给后面的所有路由
console.log('这是最简单的中间件函数')
next()
})
没\有next() 后边不执行
app.get('/', (req, res) => {
console.log('调用了 / 这个路由')
res.send('Home page.'+req.time) 会调用中间件函数中req.time 的值
})
app.get('/user', (req, res) => {
console.log('调用了 /user 这个路由')
res.send('User page.'+req.time) 会调用中间件函数中req.time 的值
})
app.listen(80, () => {
console.log('http://127.0.0.1')
})
没有next() 会搜索不到
定义多个中间件(根据先后顺序来执行)
// 定义第一个全局中间件
app.use((req, res, next) => {
console.log('调用了第1个全局中间件')
next()
})
// 定义第二个全局中间件
app.use((req, res, next) => {
console.log('调用了第2个全局中间件')
next()
})
使用局部中间件
const mw1 = function (req, res, next) {
console.log('这是最简单的中间件函数1')
// 把流转关系,转交给下一个中间件或路由
next()
}
const mw2 = function (req, res, next) {
console.log('这是最简单的中间件函数2')
// 把流转关系,转交给下一个中间件或路由
next()
}
app.get('/',mw1,mw2,(req, res) => {
console.log('调用了 / 这个路由')
res.send('Home page.'+req.time) 会调用中间件函数中req.time 的值
})
app.get('/user',[mw1,mw2] ,(req, res) => {
console.log('调用了 /user 这个路由')
res.send('User page.'+req.time) 会调用中间件函数中req.time 的值
})
中间件分类
const express=require('express')
const app=express()
应用中间件 挂在app后的 app.use( 中间件)
路由中间件 挂在express后的 express.use(中间件)
错误级别中间件
express.json
// 通过 express.json() 这个中间件,解析表单中的 JSON 格式的数据
app.use(express.json())
// 通过 express.urlencoded() 这个中间件,来解析 表单中的 url-encoded 格式的数据
app.use(express.urlencoded({ extended: false }))
// 在服务器,可以使用 req.body 这个属性,来接收客户端发送过来的请求体数据
app.post('/user', (req, res) => {
// 默认情况下,如果不配置解析表单数据的中间件,则 req.body 默认等于 undefined
console.log(req.body)
res.send('ok')
})
app.post('/book', (req, res) => {
console.log(req.body)
res.send('ok')
})
第三方中间件
监听req的data/end事件
app.use((req, res, next) => {
// 定义中间件具体的业务逻辑
// 1. 定义一个 str 字符串,专门用来存储客户端发送过来的请求体数据
let str = ''
// 2. 监听 req 的 data 事件
req.on('data', (chunk) => {
str += chunk
})
// 3. 监听 req 的 end 事件
req.on('end', () => {
// 在 str 中存放的是完整的请求体数据
const body = qs.parse(str) 调用qs.parse()方法 把查询字符串解析为对象 (解析中文)
req.body = body 将解析出来的请求体对象,挂载为req.body属性上
next() 调用next函数,执行后续的业务逻辑
})
})
cors 跨域访问
首先 npm i cors 下载cors模块
// 一定要在路由之前,配置 cors 这个中间件,从而解决接口跨域的问题
const cors = require('cors')导入cors模块
app.use(cors())使用cors