今日学习内容:
1.中间件概念
简单说,中间件(middleware)就是处理 HTTP 请求的函数。
它最大的特点就是,一个中间件处理完,再传递给下一个中间件。 中,会调用一系列的中间件。
每个中间件可以从 App 实例,接收三个参数,依次为 request 对象(代表 HTTP 请求)、response 对象(代表 HTTP 回应),next 回调函数(代表下一个中间件)。每个中间件都可以对 HTTP 请求(request 对象)进行加工,并且决定是否调用 next 方法,将 request 对象再传给下一个中间件。
2.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 请求都监听
3.中间件类别
express 有五种类别的中间件:
- 应用级别的中间件: 挂载到 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 表单数据
4.js 中的单线程和异步
Javascript 的解析和执行一直是单线程的,但是==宿主环境(浏览器或 Node)==是多线程的
- 每执行一个异步任务,宿主环境就是开启一个子线程来执行
- 异步任务是由宿主环境开启子线程完成,并通过事件驱动、回调函数、队列,把完成的任务, 交给主线程执行;Javascript 解析引擎,一直在做一个工作,就是从任务队列里提取任务,放到主线程里执行。主线程代码在运行时,会按照同步和异步代码将其分成两个去处,
如果是**同步代码**执行,就会直接将该任务放在⼀个叫做“**函数执行栈**”的空间进行执行,执行栈是典型的【栈结构】(先进后出),程序在运行的时候会将同步代码按顺序入栈,将**异步**代码放到【**工作线程**】中暂时挂起,【工作线程】中保存的是定时任务函数、JS 的交互事件、JS 的网络请求等耗时操作。当【主工程】将代码块筛选完毕后,进⼊执行栈的函数会按照从外 到内的顺序依次运行,运行中涉及到的对象数据是在堆内存中进行保存和管理的。
当执行栈内的任务全部执行完毕后,执行栈就会清空。执行栈清空后,“事件循环”就会工作,“事件循环”会检测【任务队列】中是否有要执行的任
务,那么这个任务队列的任务来源就是工作线程,程序运行期间,工作线程会把到期的定时任务、返回数据的 http 任务等【异步任务】按照先后顺序插⼊到【任务队列】中,等执行栈清空后,事件循环会访问任务队列,将任务队
列中存在的任务,按顺序(先进先出)放在执行栈中继续执行,直到任务队列清空。
5.Promise 基本使用
Promise(承诺),会创建一个容器,在该容器中自动执行一个异步程序。 该异步程序会产生两种结果:成功(resolved) 或者 失败 (rejected);主要用来解决回调地狱问题。
6. async 和 await 关键词
async 和 await 是 es7 新增的关键词,专门用来处理异步操作
async 关键词:
- 在普通函数前使用 async 关键词进行修饰,则普通函数变为==异步函数==,异步函数返回值是 Promise 对象
- 如果在 async 修饰的函数中使用 return 返回数据,则返回值会被 Promise 包裹
- 因为返回值在 Promise 中,则可以使用 then 方法来获取 return 的返回值
- 在函数体内使用 throw 抛出异常,则该异常能够被 catch 捕获
|