Koa是基于node.js开发web服务端得框架,其非常精简
koa 定制能力强需要二次开发 例如:egg.js / think.js
一 Koa 洋葱模型
写中间件时,一定要记得加上async 与 await,确保万无一失
app.use(async (ctx, next) => {
console.log(1);
await next();
console.log(2);
});
通过ctx跨中间件传递数据
务必保证洋葱模型 await next(),否则无法正确取到r
app.use(async (ctx, next) => {
await next();
let r = ctx.r;
});
app.use((ctx, next) => {
ctx.r = 'r';
});
二 路由
简易版路由
app.use(async (ctx, next) => {
let { path, method } = ctx;
if ((path === "/api/list", method === "GET")) {
ctx.body = { key: "I am batman" }; // koa会自动转换为JSON
}
await next();
});
2.1 使用koa-router中间件
npm i koa-router
const router = new Router();
router.get("/", (ctx, next) => {
let { path, method } = ctx;
if ((path === "/api/list", method === "GET")) {
ctx.body = { key: "I am batman" };
}
});
app.use(router.routes());
2.2 拆分路由文件
例如:api/v1/book.js
const Router = require("koa-router");
const router = new Router();
router.get("/v1/book", (ctx, next) => {
ctx.body = { key: "I am batman ==> book" };
});
module.exports = router;
app.js
const Koa = require("koa");
const book = require("./api/v1/book");
const classic = require("./api/v1/classic");
const app = new Koa();
app.use(book.routes());
app.use(classic.routes());
app.listen(3333);
2.3 自动注册路由
自动读取api/v1 下文件,自动使用app.use挂载
npm i require-directory -D
app.js
const Koa = require("koa");
const Router = require("koa-router");
const requireDirectory = require("require-directory");
const app = new Koa();
requireDirectory(module, "./api/v1", {
visit: whenLoadModule,
});
function whenLoadModule(obj) {
if (obj instanceof Router) {
app.use(obj.routes());
}
}
app.listen(3333);
2.4 重构路由
core/init.js
const requireDirectory = require("require-directory");
const Router = require("koa-router");
class InitManager {
static initCore(app) {
//入口方法
InitManager.app = app;
InitManager.initLoadRouters();
}
static initLoadRouters() {
const apiDirectory = `${process.cwd()}/app/api/v1`;
requireDirectory(module, apiDirectory, {
visit: whenLoadModule,
});
function whenLoadModule(obj) {
if (obj instanceof Router) {
InitManager.app.use(obj.routes());
}
}
}
}
module.exports = InitManager;
app.js
const Koa = require("koa");
const InitManager = require("./core/init");
const app = new Koa();
InitManager.initCore(app);
app.listen(3333);
三 VScode 调试与自动重启
3.1 调试
- 选择左侧menu中的debbug 或 F5
- 生成lanuch.json
- add code
{
"type": "node",
"request": "launch",
"name": "current file",
"program": "${file}"
}
- 在需要调试的文件中,点debbug 选 current file 即可调试
3.2 自动重启配置
npm i nodemon -gnodemon app.js
3.3 结合调试和自动重启
- 左侧menu debbug 或 F5
- lanuch.json
- 右下角按钮 Add Configuration 添加 nodemon setup
- dubbug中会出现nodemon调试选项