NodeJS 小程序笔记01

144 阅读1分钟

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 调试

  1. 选择左侧menu中的debbug 或 F5

  1. 生成lanuch.json

  1. add code
{
    "type": "node",
    "request": "launch",
    "name": "current file",
    "program": "${file}"
}
  1. 在需要调试的文件中,点debbug 选 current file 即可调试

3.2 自动重启配置

  1. npm i nodemon -g
  2. nodemon app.js

3.3 结合调试和自动重启

  1. 左侧menu debbug 或 F5
  2. lanuch.json
  3. 右下角按钮 Add Configuration 添加 nodemon setup
  4. dubbug中会出现nodemon调试选项