前言 koa 是由 Express 原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。使用 koa 编写 web 应用,通过组合不同的 generator,可以免除重复繁琐的回调函数嵌套,并极大地提升错误处理的效率。koa 不在内核方法中绑定任何中间件,它仅仅提供了一个轻量优雅的函数库,使得编写 Web 应用变得得心应手。
脚手架 1 2 3 4 5 6 7 8 9 10 11 12 1.安装 cli: npm install -g koa-generator 2.新建项目 koa2 [name] 3.安装依赖 cd [name] npm i 4.运行 npm run dev
使用 使用 koa 脚手架搭建的,基本上已经满足开发了,但为了方便开发,可以把路由调整一下,因为每次添加路由都操作 app.js 文件,有点麻烦。koa 官网
app.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 const Koa = require("koa"); const app = new Koa(); const views = require("koa-views"); const json = require("koa-json"); const onerror = require("koa-onerror"); const bodyparser = require("koa-bodyparser"); const logger = require("koa-logger"); const routes = require("./router"); // error handler onerror(app); // middlewares app.use( bodyparser({ enableTypes: ["json", "form", "text"] }) ); app.use(json()); app.use(logger()); app.use(require("koa-static")(__dirname + "/public")); app.use( views(__dirname + "/views", { extension: "pug" }) ); // logger app.use(async (ctx, next) => { const start = new Date(); await next(); const ms = new Date() - start; console.log(`${ctx.method} ${ctx.url} - ${ms}ms`); }); // routes routes(app); // error-handling app.on("error", (err, ctx) => { console.error("server error", err, ctx); }); module.exports = app;
router.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 const routesArr = ["index", "users"]; const baseUrl = "./routes"; function routes(app) { const newRouters = routesArr.map(url => { return `${baseUrl}/${url}`; }); newRouters.forEach(url => { const router = require(url); app.use(router.routes(), router.allowedMethods()); }); } module.exports = routes;
但还可以弄得更加方便,就是使用 fs,读取出所有的路由文件,自动注册路由。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 const fs = require("fs"); const path = require("path"); const baseUrl = "./routes"; // 递归目录 读取文件 function readFileList(dir, filesList = []) { const files = fs.readdirSync(dir); files.forEach((item, index) => { var fullPath = path.join(dir, item); const stat = fs.statSync(fullPath); if (stat.isDirectory()) { readFileList(path.join(dir, item), filesList); //递归读取文件 } else { filesList.push(fullPath); } }); return filesList; } function routes(app) { let filesList = []; readFileList(path.resolve(process.cwd(), baseUrl), filesList); filesList.forEach(url => { const router = require(url); app.use(router.routes(), router.allowedMethods()); }); } module.exports = routes;
最后更新时间:2019-12-07 16:07:58