koa 教程
2021年6月23日1安装koa
1 2 |
npm init npm i koa --save |
2理解koa洋葱模型
3.一个简单的demo
1 2 3 4 5 6 7 8 9 10 11 12 |
const Koa = require('koa'); //引入koa const app = new Koa(); //构建koa /** * ctx 包括了请求和响应 */ app.use(async ctx => { console.log(ctx) ctx.body = 'Hello World'; }); app.listen(3000); //设置端口 |
4 koa 的调试和打印日志
1 |
npm i koa-logger --save //安装模块 |
app.js文件中使用
1 2 |
const logger = require('koa-logger') app.use(logger()) |
5Koa cookies 获取 和 设置
1 2 3 4 5 6 |
app.use(async (ctx,next) => { const n = ~~ctx.cookies.get('view') + 1; ctx.cookies.set('view', n, {httpOnly:false}); // 中间件调用next要加await,否则报错404 await next(); }); |
6Koa session 获取 和 设置
1 |
npm install --save koa-session //安装模块 |
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 |
const Koa = require('koa'); //引入koa const logger = require('koa-logger') //引入koa日志打印工具 const session = require('koa-session') //实现session功能的模块 const app = new Koa(); //构建koa /*中间件使用开始*/ app.use(logger()) /*中间件使用结束*/ /*koa-session模块配置开始*/ app.keys = ['some secret hurr']; //设置签名的 Cookie 密钥 const CONFIG = { key: 'koa.sess', /** (字符串)cookie 键(默认为 koa.sess) */ /** * (number || 'session') maxAge 以毫秒为单位(默认为1天) * 'session' 会导致 cookie 在会话/浏览器关闭时过期 * 警告:如果会话 cookie 被盗,此 cookie 将永不过期 */ maxAge : 86400000, autoCommit : true, /** (boolean) 自动提交标头 (默认为 true) */ overwrite : true, /** (boolean) 可以覆盖或不覆盖 (默认为 true) */ httpOnly : true, /** (boolean) httpOnly or not (默认为 true) */ signed : true, /** (boolean) 签名与否(默认为 true) */ rolling : false, /** (boolean) 强制在每个响应上设置会话标识符 cookie。到期重置为原来的maxAge,重置到期倒计时。(默认为 is false) */ renew : false, /** (boolean) 当会话即将到期时更新会话,因此我们可以始终保持用户登录状态. (默认为 is false)*/ secure : false, /** (boolean) 安全 cookie*/ sameSite : null, /** (string) session cookie 相同点选项 (默认为 null, don't set it) */ }; app.use(session(CONFIG, app)); /*koa-session模块配置结束*/ /** * 设置cookies */ app.use(ctx => { // ignore favicon if (ctx.path === '/favicon.ico') return; let n = ctx.session.views || 0; ctx.session.views = ++n; ctx.body = ctx.session.views + 'views'; }); app.listen(3000); //设置端口 |
7将 koa 的session 存在内存中
安装命令
1 |
npm install --save koa-session-local |
编辑app.js配置
1 2 3 4 5 6 7 |
const store = require('koa-session-local'); const CONFIG = { store:new store(), . . . |
8将 koa 路由使用
1 2 |
npm i @koa/router --save #这个有人维护 用这个 npm i koa-router --save #这个没人维护 |
编辑app.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
const Router = require("@koa/router") //路由 . . . router.get('/', (ctx, next) => { ctx.body = 'views'; }); app .use(router.routes()) .use(router.allowedMethods()); . . . |
9 实现jwt (JSON WEB TOKEN)验证
1 2 |
npm install koa-jwt npm install jsonwebtoken |
写内容的地方
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 |
const koajwt = require('koa-jwt'); const jsonwebtoken = require('jsonwebtoken'); . . . /*jwt验证开始*/ app.use(koajwt({secret: 'mimazhli'}).unless({ path: ['/sign','/verify'] })); /*jwt验证结束*/ /*路由设置开始*/ router.get('/sign', (ctx, next) => { ctx.body = jsonwebtoken.sign({'user': 'mimazhli'}, 'mimazhli'); }); router.get('/verify', (ctx, next) => { ctx.body = jsonwebtoken.verify(ctx.request.query.token, 'mimazhli'); }); router.get('/user/web-view', (ctx, next) => { ctx.body = '成功'; }) . . . |
10 Koa实现微信登陆
1 2 |
npm i koa2-weixin-auth --save #微信登陆 npm install koa koa-body --save #解决request.body空的问题 |
11 koa返回试图和视图变量绑定
1 2 3 4 5 6 7 8 9 |
//方案一 这个模板引擎好像是腾讯开发的 npm install --save koa-art-template //模板引擎 npm install art-template --save //koa-art-template依赖art-template npm install html-minifier //基于JavaScript将html压缩 npm install koa-static-server //因该是静态资源访问 //方案二 是官网的 npm install --save koa-views //视图管理模块 npm install --save ejs //模板引擎 |
编辑config/view.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
const path = require('path'); //路径拼接 const htmlMinifier = require('html-minifier') //用于压缩html的 const common = require("../lib/common") //常用函数 module.exports = { root : path.join(__dirname, '../views'), minimize : true, htmlMinifier : htmlMinifier, htmlMinifierOptions: { collapseWhitespace : true, minifyCSS : true, minifyJS : true, ignoreCustomFragments: [] // 运行时自动合并:rules.map(rule => rule.test) }, escape : true, extname : '.html', debug : process.env.NODE_ENV !== 'production', imports : common } |
编辑 middleware/index.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
. . . const viewConfig = require('../config/view') //视图配置 const render = require('koa-art-template'); //一个视图模板 module.exports = app => { . . . render(app, viewConfig) } . . . |
使用routers/web/index-router.js
1 2 3 4 5 6 7 8 |
router.get('/index', async (ctx, next) => { await ctx.render('web/index/index', { title : '你好', arr : [1, 2, 3], now : new Date() }) }) |
全局模板函数 koa-demo/lib/common.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 |
module.exports = { /** * 时间戳转文字 * @param d * @param fmt * @returns {*} */ dataFormat: (d, fmt) => { var o = { "M+": d.getMonth() + 1, //月份 "d+": d.getDate(), //日 "h+": d.getHours() % 12 == 0 ? 12 : d.getHours() % 12, //小时 "H+": d.getHours(), //小时 "m+": d.getMinutes(), //分 "s+": d.getSeconds(), //秒 "q+": Math.floor((d.getMonth() + 3) / 3), //季度 "S": d.getMilliseconds() //毫秒 }; var week = { "0": "/u65e5", "1": "/u4e00", "2": "/u4e8c", "3": "/u4e09", "4": "/u56db", "5": "/u4e94", "6": "/u516d" }; if (/(y+)/.test(fmt)) { fmt = fmt.replace(RegExp.$1, (d.getFullYear() + "").substr(4 - RegExp.$1.length)); } if (/(E+)/.test(fmt)) { fmt = fmt.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? "/u661f/u671f" : "/u5468") : "") + week[d.getDay() + ""]); } for (var k in o) { if (new RegExp("(" + k + ")").test(fmt)) { fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); } } return fmt; }, } |
视图层views/web/index/index.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> {{title}} {{now | dateFormat "yyyy-MM-dd hh:mm:ss"}} </body> </html> |
12 koa 配置静态资源服务器
1 |
npm install koa-static-server |
编辑middleware/index.js
1 2 3 4 5 |
const koaStaticServer = require('koa-static-server') //koa 静态资源 module.exports = app => { app.use(koaStaticServer({rootDir: 'public', rootPath: '/public'})) //静态资源配置 } |
13 koa 操作mysql 数据库
1 2 3 4 5 6 7 8 |
npm install --save sequelize # 选择以下之一: npm install --save pg pg-hstore # Postgres npm install --save mysql2 npm install --save mariadb npm install --save sqlite3 npm install --save tedious # Microsoft SQL Server |