koa2 快速入门

简单说说 koa2

koa2 是由 express 的原班人马开发的,koa 框架有两个版本:koakoa2

koa 使用 ES6 的 generator 来编写的,当 node 引擎支持 ES8 之后,koa 的创始人立即使用 asyncawait 重构了 koa 框架,就有了现在的 koa2。

所以,下文中下载 koa2 的脚手架工具时,下载的是 koa....(详见下文)。

脚手架和基础配置

脚手架

koa2 提供了脚手架工具,可以用来更好的创建 koa2 项目。

npm 下载地址:https://www.npmjs.com/package/koa-generator

终端输入:

npm install -g koa-generator

会自动全局安装 koa 脚手架工具。

koa2 -e koa2-weibo-code

执行上面命令,会自动创建 koa2-weibo-code 项目

然后使用 yarn 或者 npm 安装所需依赖。

其他工具

cross-env

用来管理环境变量的模块,不同操作系统中配置不一样,可以使用 cross-env 来做同一配置。

安装:

yarn add cross-env --dev

然后将 package.json 中的 script 节点下的配置信息改为:

"dev": "cross-env NODE_ENV=dev ./node_modules/.bin/nodemon bin/www",
"prd": "cross-env NODE_ENV=production pm2 start bin/www",

知识点

配置二级路由

主文件 ( app ) 中,需要引入二级路由文件,并使用 use 方法分配二级路由的。与 express 略有不同,如下代码所示:

// 一些依赖
const api = require('./routes/api')
// 一些代码

// 添加二级路由
app.use(api.routes(), users.allowedMethods());

主文件中无需为二级路由分配路径

二级路由文件中:

const router = require("koa-router")();
// 定义路由前缀(当前路由的路径)
router.prefix("/api");
// 处理二级路由下的 login 路径
router.get('/login', async (ctx, next) => {
    // ctx.body 表示向客户端发送的数据
    ctx.body = {
        ctx
    }
})
// 导出配置完的 router
module.exports = router

第 1 行代码后的 () 不要少

koa2 使用 ctx 替代了 express 中的 req,res 参数

接受 get 参数

这就要分为两点来说了:

  • 普通的 get 提交方式获取参数
  • RESTful API 方式获取参数

获取普通 get 参数

先看一下 koa2 路由代码:

const router = require("koa-router")();

const router = async (ctx, next) => {
    ctx.body = {
        "这是一个路由"
    }
})

module.exports = router

上面代码为最基本的 koa2 路由

使用 ctx.query 可以获取普通的 get 参数,如下代码所示:

async (ctx, next) => {
    // query 可以获取原本的通过 get 提交的参数
    console.log(ctx.query)
    // ctx.body 表示向客户端发送的数据
    ctx.body = {
        ctx
    }
}

获取 RESTful API 形式的参数

使用 ctx.params 可以获取 RESTful 格式的 get 参数,如下代码所示:

router.get('/login/:user', async (ctx, next) => {
    // params 可以获取 RESTful api 格式匹配到的路由
    console.log(ctx.params)
    ctx.body = {
        ctx
    }
})

postman 中输入 http://localhost:3001/api/login/lijiaqi vscode 控制台中打印:

{ user: 'lijiaqi' }

接受 post 参数

koa2 接受 post 参数需要使用 ctx.request.body ,如下代码所示:

router.post('/login', async (ctx, next) => {
  // 使用 ctx.request.body 可以获取 post 参数
  console.log(ctx.request.body);

  ctx.body = {
    ctx,
  }
})

不要和 ctx.body 混淆

使用 postman 进行测试:
koa2 快速入门

结果:

{ username: 'lijiaqi', password: '123' }

路由重定向

使用 router 的 redirect 方法,如下代码所示:

router.redirect("/", "/list");

当访问首页时,自动跳转到 list 页面

上一篇:使用nodejs构建Docker image最佳实践


下一篇:MTK 充电知识