简单说说 koa2
koa2
是由 express
的原班人马开发的,koa
框架有两个版本:koa
和 koa2
。
koa
使用 ES6 的 generator
来编写的,当 node 引擎支持 ES8 之后,koa
的创始人立即使用 async
和 await
重构了 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 进行测试:
结果:
{ username: 'lijiaqi', password: '123' }
路由重定向
使用 router 的 redirect 方法,如下代码所示:
router.redirect("/", "/list");
当访问首页时,自动跳转到 list 页面