koa实战-快速打造一个CMS系统
koa介绍
基于Node.js平台的下一代web开发框架
由 Express 原班人马打造的 koa,致力于成为一个更小、更富有表现力、更健壮的 web 开发框架。 使用 koa 编写 web 应用,通过组合不同的 generator,可以免除重复繁琐的回调函数嵌套, 并极大地提升常用错误处理效率。Koa 不在内核中打包任何中间件,它仅仅提供了一套优雅的函数库, 使得编写 Web 应用变得得心应手。
node.js环境 版本v7.6以上,koa2
快速开始
1.koa安装
1 | npm install koa |
2.编写app.js
1 | const Koa = require('koa') |
3.启动web服务
1 | node app.js |
koa中间件
koa对网络请求采用了中间件的形式处理,中间件可以介入请求和相应的处理,是一个轻量级的模块,每个中间负责完成某个特定的功能。中间件的通过next函数联系,执行next()后会将控制权交给下一个中间件,如果没有有中间件没有执行next后将会沿路折返,将控制权交换给前一个中间件
创建中间件
新建 md.js
1 | module.exports = function () { |
使用中间件
1 | const Koa = require('koa') |
路由
原生实现路由
1 | app.use( async ( ctx ) => { |
页面渲染可使用ejs, Jade,Nunjucks等模板引擎。
使用路由中间件
1.安装koa-router
1 | npm install --save koa-router |
2.router使用
1 | const Koa = require('koa'); |
cookie/session
cookie使用
koa提供了从上下文直接读取、写入cookie的方法
- ctx.cookies.get(name, [options]) 读取上下文请求中的cookie
- ctx.cookies.set(name, value, [options]) 在上下文中写入cookie
koa2 中操作的cookies是使用了npm的cookies模块
1 | // 响应头写入cookie |
koa-session
koa2原生功能只提供了cookie的操作,但是没有提供session操作,只能自己实现或通过第三方中间件实现,这里我们用到了koa-session
。
1 | npm install koa-session |
使用cookie存储session数据
1 | // session config |
使用外部store存储数据
1 | // 外部store必须实现以下3个方法 |
如果session数据量很小,可以直接存在内存中,如果session数据量很大,则需要存储介质存放session数据,比如redis,mysql等。
数据库
一个完整的系统当然少不了数据库,这里我们使用mysql。
ORM安装
1 | npm install sequelize |
数据库连接配置
1 | const Sequelize = require('sequelize'); |
Model操作
1 | // 新增 |
开发调试
node调试方式有三种
- VSCode调试模块
- Chrome 调试
- 打印日志调试(debug模块)
这里使用Chrome调试,依赖环境如下
- node环境8.x+
- chrome 60+
1 | node --inspect app.js |
debug模块可以根据debug环境变量,控制不同命名空间的日志输出,开发过程中可使用nodemon根据文件修改自动重启服务。
项目框架搭建
开发环境
- git
- node (v8.11.1)
- mysql (v5.6+)
- redis
目录结构
1 | . |
功能模块
- 多级路由
- 应用日志
- 参数校验
- 权限控制
- 负责均衡
- 邮件通知
- 钉钉通知
多级路由
全局路由模块
1 | let router = new Router(); |
具体路由模块
1 | const routers = router |
日志
应用日志
应用日志这里使用了log4js
log4js配置
1 | module.exports = { |
实例化logger
1 | const log4js = require('log4js'); |
日志记录
1 | const { appLogger , httpLogger} = require('./utils/log'); |
访问日志
access日志这里使用了koa-logger
1 | const logger = require('koa-logger') |
参数校验
web前端输入内容都是不可信的,后端必须校验请求参数,这里用到了joi
。
Object schema description language and validator for JavaScript objects.
1 | const Joi = require('joi'); |
权限控制
鉴权中间件
1 | let auth = (authority)=>{ |
鉴权中间件使用
1 | const routers = router |
负责均衡
pm2多进程
通过pm2进程管理工具管理应用,实现多进程负载
1 | module.exports = { |
nginx负载均衡
nginx部分配置
1 | #设定负载均衡的服务器列表 |
邮件通知
1 | let nodemailer = require('nodemailer'); |
钉钉通知
通过request
封装钉钉机器人接口请求
1 | const ddUtil = { |
钉钉机器人,更多用法参见 https://open-doc.dingtalk.com/docs/doc.htm?spm=a219a.7629140.0.0.karFPe&treeId=257&articleId=105735&docType=1
上线部署
部署构图如下:
Node服务进程管理工具: