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/.羞涩的煎饼/nodemon 羞涩的煎饼/www","prd": "cross-env NODE_ENV=production pm2 start 羞涩的煎饼/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 }})// 导出配置完的 routermodule.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 页面