});
app.listen(3000);
可以看出我们使用了 koa-views 中间件后,让 ctx 上多了 render 方法帮助我们实现对模板的渲染和响应页面,就和直接使用 ejs 自带的 render 方法一样,并且从用法可以看出 render 方法是异步执行的,所以需要使用 await 进行等待,接下来我们就来模拟实现一版简单的 koa-views 中间件。
文件:my-koa-views.js
const fs = require("fs");
const path = require("path");
const { promisify } = require("util");// 将读取文件方法转换成 Promise
const readFile = promisify(fs.radFile);
// 到处中间件
module.exports = function (dir, options) {
return async (ctx, next) => {
// 动态引入模板依赖模块
const view = require(options.extension);
ctx.render = async (filename, data) => {
// 异步读取文件内容
let tmpl = await readFile(path.join(dir, `${filename}.${options.extension}`), "utf8");
// 将模板渲染并返回页面字符串
let pageStr = view.render(tmpl, data);
// 设置响应类型并响应页面
ctx.set("Content-Type", "text/html;charset=utf8");
ctx.body = pageStr;
}
// 继续向下执行
await next();
}
}
挂在 ctx 上的 render 方法之所以是异步执行的是因为内部读取模板文件是异步执行的,需要等待,所以 render 方法为 async 函数,在中间件内部动态引入了我们使的用模板,如 ejs ,并在 ctx.render 内部使用对应的 render 方法获取替换数据后的页面字符串,并以 html 的类型响应。
koa-static 中间件模拟
下面是 koa-static 中间件的用法,代码使用的依赖如下,使用前需安装。
npm install koa koa-static mimekoa-static 具体用法如下:
koa-static 的用法
const Koa = require("koa");
const static = require("koa-static");
const path = require("path");const app = new Koa();
app.use(static(path.resolve(__dirname, "public")));
app.use(async (ctx, next) => {
ctx.body = "hello world";
});
app.listen(3000);
通过使用和分析,我们知道了 koa-static 中间件的作用是在服务器接到请求时,帮我们处理静态文件,如果我们直接访问文件名的时候,会查找这个文件并直接响应,如果没有这个文件路径会当作文件夹,并查找文件夹下的 index.html ,如果存在则直接响应,如果不存在则交给其他中间件处理。
文件:my-koa-static.js
const fs = require("fs");
const path = require("path");
const mime = require("mime");
const { promisify } = require("util");









