- 1. 中间件
- 1.2 express 中间件概述
- 每一个 app.get / app.post 都是一个中间件
- 当 app.get / app.post 的回调函数有参数3 (next)。调用 next方法时,执行完当前中间件就会执行下一个中间件
- 中间件是从上向下执行的,编写中间件时必须注意中间件的调用顺序
- 简单说,中间件(middleware)就是处理HTTP请求的函数。
- 它最大的特点就是,一个中间件处理完,再传递给下一个中间件。 中,会调用一系列的中间件。
- 每个中间件可以从App实例,接收三个参数,依次为request对象(代表HTTP请求)、response对象(代表HTTP回应),next回调函数(代表下一个中间件)。每个中间件都可以对HTTP请求(request对象)进行加工,并且决定是否调用next方法,将request对象再传给下一个中间件。
- 一个不进行任何操作、只传递request对象的中间件,就是下面这样。
- 1.3 app.use 方法
- 使用格式: app.use(url, callback)
- app.use( (req, res, next) => {}): 未设置参数1,则会监听所有的浏览器请求;不论get请求还是post请求,也不管请求的url地址是什么都会执行。
- app.use('/index', (req, res, next) => {}): 只监听 url 为 /index的请求,get和post请求都监听
- 1.4 自定义中间件
- 目标: 每当浏览器输入地址访问时,就将当前访问的 url 和 时间 保存到 run.log 文件中
- 缺点: 每个路由监听中重复的代码太多,最好封装成一个函数
- 1.6 检测登录状态中间件
- 方法: 在每个路由中都要检测 isLogin 的状态,除了 /login 和 /checkLogin
- 1.7 中间件类别
- - 应用级别的中间件: 挂载到 app 上的中间件,例如:app.use()、app.get()、app.post()
- - 路由级别的中间件: 挂载到 router 对象上的中间件,例如:router.get()、 router.post()
- - 错误级别的中间件: 回调函数中,有四个参数 app.use((err, req, res, next)=>{})
- - 内置中间件: express.static() , express提供的唯一内置中间件
- - 第三方中间件: express框架提供的,需要程序员手动安装才能使用的中间件;`body-parser` 解析post 表单数据
- 2. PromiseAPI
- js中的单线程和异步
- Javascript 的解析和执行一直是单线程的,但是宿主环境(浏览器或Node)是多线程的;
- 每执行一个异步任务,宿主环境就是开启一个子线程来执行
- 异步任务是由宿主环境开启子线程完成,并通过事件驱动、回调函数、队列,把完成的任务, 交给主线程执行;
- Javascript解析引擎,一直在做一个工作,就是从任务队列里提取任务,放到主线程里执行。
- 上图是JavaScript运⾏时的⼀个工作流程和内存划分的简要描述,我们根据图中可以得知主线程就是我们JavaScript执行代码的线程,
- 主线程代码在运行时,会按照同步和异步代码将其分成两个去处,
- 如果是同步代码执行,就会直接将该任务放在⼀个叫做“函数执行栈”的空间进行执行,执行栈是典型的【栈结构】(先进后出),程序在运行的时候会将同步代码按顺序入栈,
- 将异步代码放到【工作线程】中暂时挂起,【工作线程】中保存的是定时任务函数、JS的交互事件、JS的网络请求等耗时操作。当【主工程】将代码块筛选完毕后,进⼊执行栈的函数会按照从外 到内的顺序依次运行,运行中涉及到的对象数据是在堆内存中进行保存和管理的。
- 当执行栈内的任务全部执行完毕后,执行栈就会清空。执行栈清空后,“事件循环”就会工作,“事件循环”会检测【任务队列】中是否有要执行的任
- 务,那么这个任务队列的任务来源就是工作线程,程序运行期间,工作线程会把到期的定时任务、返回数据的http任务等【异步任务】按照先后顺序插⼊到【任务队列】中,等执行栈清空后,事件循环会访问任务队列,将任务队
- 列中存在的任务,按顺序(先进先出)放在执行栈中继续执行,直到任务队列清空。
- 2.2 回调地狱
- js 中大量使用了回调函数进行异步操作,而异步操作什么时候返回结果是不可控的,所以希望一段程序按我们指定的顺序执行就需要在异步的回调函数中进行嵌套。
- 2.3 Promise基本使用
- 为了解决回调地狱问题,ECMAScript 6 提供了一个新的API --- Promise。 Promise能够将回调函数嵌套改为 then 方法的链式操作,从而提升代码的可读性和可维护性。
- Promise(承诺),会创建一个容器,在该容器中自动执行一个异步程序。 该异步程序会产生两种结果:成功(resolved) 或者 失败 (rejected
- 2.4 Promise解决回调地狱
- 案例: 连续读取 a.txt、b.txt、c.txt 文件内容并输出
- 使用then链式调用输出文件内容,每个then方法内都继续调用文件读取函数继续返回Promise对象
- 2.5 async和await关键词
- async 和 await 是 es7 新增的关键词,专门用来处理异步操作
- async 关键词:
- 在普通函数前使用 async 关键词进行修饰,则普通函数变为异步函数,异步函数返回值是 Promise 对象
- 如果在async修饰的函数中使用return返回数据,则返回值会被Promise包裹
- 因为返回值在Promise中,则可以使用 then 方法来获取return的返回值
- 在函数体内使用 throw 抛出异常,则该异常能够被 catch 捕获
- await 关键词:
- await 关键词只能出现在 promise 封装的函数前
- await 关键词能够暂停程序执行,等待Promise执行的结果,当得到Promise函数执行结果之后程序再继续向下执行
- 2.6 async和await配合依次读取文件
- 重点:
- 在一个函数中如果调用了一个Promise封装的异步函数,则该函数使用async修饰,而Promise封装的函数使用await修饰,则编程方式就可以写成同步格式
- 2.7 mysql操作改造
- 目标: 使用 promise 封装mysql异步操作
- 实现思路:
- ① 在db.js文件中使用 promise 封装 query 方法, 导出一个通用的查询方法
- ③ 封装CURD方法,内部已经写好sql语句,只需要传入简单参数即可
|