中间件介绍
- 什么是中间件
中间件其本质就是一个回调函数,可以像路由一样访问请求对象(request)和响应对象(response)。 - 中间件的作用是什么
通过函数封装公共操作,简化代码 - 中间件类型
- 全局中间件
- 路由中间件
全局中间件的实现
例子:简单实现一个log日志,记录每次访问url地址及时间
js
const express = require('express')
const path = require('path')
const fs = require('fs')
const app = express()
// 声明中间件函数
function middlewarw(req,res,next) {
let {url} = req
// 加这一步是因为默认会先访问favicon.ico文件,为了显示跳过对 favicon.ico 的处理
if (url === '/favicon.ico') {
return next();
}
// 获取时间
const now = new Date();
// 简便用了toISOString()方法,复杂的处理可以使用dayjs
const timestamp = now.toISOString().replace('T', ' ').slice(0, 19);
// 通过fs模块将记录写入文件
fs.appendFileSync(path.resolve(__dirname+'/record.log'),`${url} ${timestamp}\r\n`)
// next是为了上面执行完成后 继续执行后续的方法
next()
}
// 声明完成中间件要通过下面方式调用
app.use(middlewarw)
app.get('/index',(req,res)=>{
res.send('首页')
})
app.get('/admin',(req,res)=>{
res.send('管理系统首页')
})
// 错误处理
app.all('*',(req,res)=>{
res.send('<h1>404</h1>')
})
// 监听端口
app.listen('3000',()=>{
console.log('启动成功');
})
上面的逻辑就实现了一个全局中间件,这样即便有再多的访问路径,也都会被记录到log文件中。
运行程序会看到当前目录下会生成一个log文件,打开文件查看内容,就会看到我们想要的结果
路由中间件
实现一个简单的路由中间件(示例),与全局路由不同的是中间件函数要放到路由中执行
js
const express = require('express')
const app = express()
// 中间件函数
const routeMiddlewarw = (req,res,next)=> {
// 假设访携带code值1则有访问权限
if(req.query.code === '1'){
// 继续执行后续
next()
}else{
res.send('没问访问权限')
}
}
// 中间件函数 放到第二个参数执行
app.get('/index',routeMiddlewarw,(req,res)=>{
res.send('首页')
})
app.get('/admin',routeMiddlewarw,(req,res)=>{
res.send('管理系统首页')
})
app.all('*',(req,res)=>{
res.send('<h1>404</h1>')
})
app.listen('3000',()=>{
console.log('启动成功');
})
实际运行前后对比
静态资源中间件
创建静态目录
在html中引用css
js
const express = require('express')
const app = express()
// 设置静态资源中间件
app.use(express.static(__dirname + '/publick'))
// 路由
app.get('/',(req,res)=>{
res.send('首页')
})
app.all('*',(req,res)=>{
res.send('<h1>404</h1>')
})
app.listen('3000',()=>{
console.log('启动成功');
})
启动之后访问3000端口
也可以尝试这样访问
注意事项
- index.html文件,是默认打开的资源文件,比如http:localhost:3000,这样直接就访问到了index.html
- 静态资源和路由规则,谁先匹配就优先响应谁也可以理解为谁先执行谁先响应。例如:
这样就会优先访问到首页这个页面。