先初始化和下载koa:
npm init -y
npm install koa -D
第一段代码:
const Koa = require("koa"); // 引入Koa
let server = new Koa(); // 创建实例
server.listen(8000); // 监听端口
server.use(async ctx => {
ctx.body = "hello, world!"
})
// ctx.body是给用户返回的内容
代码中的server没有直接的.get.post等方法,只有.use方法。
代码中的server.use中只接受一个参数,并且是函数。
中间件:
express和koa的核心概念,请求会顺序经过所有中间件处理(像流水线一样),得到最终结果。
- 中间件按照添加的先后执行
- ctx(上下文的对象)在整个执行过程中共享,非常适合传递数据
- 需要手动调用next才会向下执行
ctx对象的第二个参数是next:
const Koa = require("koa");
let server = new Koa(); // 创建实例
server.listen(8000); // 监听端口
server.use(async (ctx, next) => {
ctx.body = "hello, world!";
await next();
})
server.use(async ctx => {
ctx.body += "hello, world! 2"
})
server.use(async ctx => {
ctx.body = "hello, world! 3"
})
练习中间件:
读取文件返回给请求的客户端,并保存求情记录。
npm install promise-fs -D
const Koa = require("koa");
const fs = require("promise-fs")
let server = new Koa();
server.listen(8000);
// 1.读取文件
server.use(async (ctx, next) => {
let data = await fs.readFile('./data/1.txt');
ctx.str = data.toString();
await next();
})
// 2.保存日志
server.use(async (ctx, next) => {
await fs.appendFile("access.log", `[${new Date().toGMTString()}] ${ctx.method} ${ctx.url} \n`);
await next();
})
// 3.返回
server.use(async ctx => {
ctx.body = ctx.str;
})
简化:
const Koa = require("koa");
const fs = require("promise-fs")
let server = new Koa(); // 创建实例
server.listen(8000); // 监听端口
server.use(async (ctx, next) => {
// 1.读取文件
let data = await fs.readFile('./data/1.txt');
// 2.保存日志
await fs.appendFile("access.log", `[${new Date().toGMTString()}] ${ctx.method} ${ctx.url} \n`);
// 3.返回
ctx.body = data.toString();
})
中间件使用场景:
- 全局性处理工作、权限、角色验证
- 可重用组件