一、有没有写过 Koa 中间件,说下中间件原理,介绍下自己写过的中间件?

  • koa 本来就是一个轻量级框架,本身支持的功能并不多,功能都是通过中间件来实现不同的需求。开发者可以通过不同的中间件来按需求扩展不同的功能。

    koa中中间件本质上就是函数,可以是一个async函数,也可以是一个普通的函数。如下代码:

  1. // 普通函数
  2. const middleWare1 =function (ctx, next) {
  3. return next().then(() =>{
  4. console.log("I am middleWare1");
  5. })
  6. }
  7. // async 函数
  8. const middleWare2 = async function(ctx,next){
  9. console.log("I am middleWare2")
  10. await next();
  11. }
  12. app.use(middleWare1);
  13. app.use(middleWare2);
  • 中间件原理:中间件会遵循洋葱模型,中间件执行循序并不是会 从头执行到尾,而是会先执行最外层中间件,当调取next()函数后进入下一个中间件执行,一路执行到最里层中间件,然后在从最里层执行到最外层。

    例如log中间件:通过日志中间件记录网络请求类型及日志,记录请求ip、方式、地址及请求时间。

  1. const fs =require("fs");
  2. module.exports=async (ctx,next) =>{
  3. const startTime =Date.now();
  4. const requestTime =newDate();
  5. await next();
  6. const ms = Date.now() - startTime;
  7. const logout =`${ctx.request.ip}--${requestTime}--${ctx.method}--${ctx.url}--${ms}ms`;
  8. fs.appendFileSync("./log.txt",logout+"\n")
  9. }

二、如何判断当前脚本运行在浏览器还是node环境中?

使用typeof 检测全局对象,为window就是浏览器环境

  1. return typeof process !== 'undefined' ? 'node' : 'window'