带你入坑Nodejs(五)

2,309 阅读3分钟

这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战

中间件

什么是中间件

对比自来水生产过程

2.png

d:/aaa/ABC.JPG: 截取文件后缀并转为小写 .jpg

3.png 上图中lastIndexOf、slice、toLowerCase几个方法就可以认为是中间件

中间件按顺序调用,对字符串 d:/aaa/ABC.JPG进行加工,得到最终的结果 Express是一种路由和中间件的Web框架,Express应用程序本质上是一系列中间件函数调用。

express中间件是一个特殊的url地址处理函数

  • 该函数中有三个基本参数, req、res、next
  • req就是回调函数中的req对象
  • res就是回调函数中的res对象
  • next:当该中间件执行完成后自动进入下一个中间件

自定义中间件

案例1: 记录日志中间件

目标: 每当浏览器输入地址访问时,就将当前访问的url和时间保存到 run.log 文件中

  1. 使用fs模块,在每一个路由中都调用appendFile方法将日志所需内容写入。
// 加载 fs 模块
const fs = require('fs')

app.get('/index',(req, res) => {
    /**
       参数1:要写的文件
       参数2:要写的内容---字符串
       参数3:可选,utf-8
       参数4:回调函数
    */
    const str = req.url + '' + new Date() + '\n'
    fs.appendFile('./run.log', str ,(err) => {})
    res.send('首页')
})

app.get('/list', (req, res) => {
    const str = req.url + '' + new Date() + '\n'
    fs.appendFile('./run.log', str, (err) => {})
    res.send('列表页')
})

缺点: 很麻烦,每个路由中都要写两行代码

  1. 将写日志的代码封装为函数,在每个路由中都调用
app.get('/index',(req, res) => {
    writeLog(req)
    res.send('首页')
})

app.get('/list', (req, res) => {
    writeLog(req)
    res.send('列表页')
})

function writeLog (req) {
    const str = req.url + '' + new Date() + '\n'
    fs.appendFile('./run.log', str ,(err) => {})
}

缺点:依然麻烦,如果有50个路由,就要调用50次方法

  1. 将writeLog方法注册为中间件

① 将writeLog方法封装为中间件函数

function writeLog (req,res,next) {
    const str = req.url + '' + new Date() + '\n'
    fs.appendFile('./run.log', str ,(err) => {
        if(err) {
            // 出现错误时,进行提示,并结束程序
            return res.send('写入失败日志')
        }else{
            // 未出现错误,进入下一个中间件来指行
        }
    })
}

② 在监听路由之前,先将writeLog 注册为中间件

③ 在每个路由中都将 writeLog 函数删除

// 将writeLog注册为中间件
app.use(writeLog)

app.get('/index', (req, res) => {
    res.send('首页')
})

案例2: 自定义url检测中间件,不存在的url地址直接显示 404 not found

function checkUrl (req, res, next) {
    if(res.url != '/index' && req.url !== '/list') {
        return res.end('404 not found')
    }
    next()
}

注意调用顺序:

app.use(writeLog)
app.use(checkUrl)

先调用 writeLog 中间件时,不管url地址是否正确,都会记录 run.log 文件

先调用 checkUrl 中间件时,如果url地址不正确就不会写 run.log 文件

图例中间件工作原理

1550420192624.png

中间件类别

express有五中类别的中间件:

  • 应用级别的中间件: 挂载到 app 上的中间件,例如:app.use()
  • 路由级别的中间件: 挂载到 router 对象上的中间件,例如:router.get()、 router.post
  • 错误级别的中间件: 回调函数中,有四个参数 app.use((err, req, res, next)=>{})
  • 内置中间件: express.static() , express提供的唯一内置中间件
  • 第三方中间件: 非express框架提供的,需要程序员手动安装才能使用的中间件;body-parser 解析post 表单数据

一图解释MVC思想

1546342547593.png

  • controller 控制器 处理业务
  • model 数据模型 操作数据
  • view 视图 页面渲染&json数据响应
  • utils 工具
  • public 静态资源
  • app.js 程序入口
  • router.js 定义路由规则
  • middleware.js 自定义中间件
  • config.js 配置项
  • .gitignore git管理的时候忽略掉的文件或目录

以上目录和文件的命名 仅供参考 下篇讲node模块化 点赞支持、手留余香、与有荣焉,动动你发财的小手哟,感谢各位大佬能留下您的足迹。

往期精彩推荐

前端万字面经——基础篇

前端万字面积——进阶篇

聊一聊前端开发中最常用的两种管理工具

聊聊让人头疼的正则表达式

手摸手带你肝nodejs(一)

获取文件blob流地址实现下载功能

手摸手带你肝 nodejs (二)

git 实现自动推送

手摸手带你肝nodejs(三)

手摸手带你肝nodejs(四)