一、有没有写过 Koa 中间件,说下中间件原理,介绍下自己写过的中间件?
- koa 本来就是一个轻量级框架,本身支持的功能并不多,功能都是通过中间件来实现不同的需求。开发者可以通过不同的中间件来按需求扩展不同的功能。
koa中中间件本质上就是函数,可以是一个async函数,也可以是一个普通的函数。如下代码:
// 普通函数
const middleWare1 =function (ctx, next) {
return next().then(() =>{
console.log("I am middleWare1");
})
}
// async 函数
const middleWare2 = async function(ctx,next){
console.log("I am middleWare2")
await next();
}
app.use(middleWare1);
app.use(middleWare2);
- 中间件原理:中间件会遵循洋葱模型,中间件执行循序并不是会 从头执行到尾,而是会先执行最外层中间件,当调取next()函数后进入下一个中间件执行,一路执行到最里层中间件,然后在从最里层执行到最外层。
例如log中间件:通过日志中间件记录网络请求类型及日志,记录请求ip、方式、地址及请求时间。
const fs =require("fs");
module.exports=async (ctx,next) =>{
const startTime =Date.now();
const requestTime =newDate();
await next();
const ms = Date.now() - startTime;
const logout =`${ctx.request.ip}--${requestTime}--${ctx.method}--${ctx.url}--${ms}ms`;
fs.appendFileSync("./log.txt",logout+"\n")
}
二、如何判断当前脚本运行在浏览器还是node环境中?
使用typeof 检测全局对象,为window就是浏览器环境
return typeof process !== 'undefined' ? 'node' : 'window'