eggjs技术栈
后端.jpg

egg框架扩展
image.png

模块.jpg

egg入门

  1. 初始化 eggjs项目
  2. 配置路由
  3. 静态文件中间件
  4. 模板引擎
  5. 远程服务接口
  6. 扩展工具方法
  7. 单元测试

运行环境

  1. config.dev.js 会覆盖 config.default.js
    1. 先执行 default.js,后执行其他环境
  2. set EGG_SERVER_ENV = prod 设置环境变量
  1. config.default.js // 默认环境
  2. config.dev.js // 开发环境
  3. config.prod.js // 正式环境
  1. package.json
    1. mac 和 win10环境不一样,用 cross-env, 跨操作系统设置环境变量
    2. npm install cross-env -D
  1. "scripts": {
  2. "dev": "`set EGG_SERVER_ENV=dev && egg-bin dev",
  3. "start": "`set EGG_SERVER_ENV=prod && egg-scripts start",
  4. }

tree显示树状结构

  1. -I命令,使用正则匹配来排除掉的文件夹
  2. 使用|同时排除掉多个文件夹
  1. tree -I "node_modules|cache|test_*" -L 3
  2. tree -I "node_modules"
  3. # 最后一个使用到正则匹配,这样以test_开头的文件夹都不会被显示出来
  4. tree -I "node_modules|cache|test_*"
  5. # 只看两级目录
  6. tree -L 2

eggjs中间件

  1. npm 安装插件
  2. config/plugin.js 启用插件

静态文件中间件

  1. egg内置了 static插件
  2. static默认映射 public -> app/public/目录
  3. 把静态资源都放到 app/public/目录
  1. <link href="/public/css/bootstrap.min.css" rel="stylesheet">
  2. <script src="/public/js/bootstrap.min.js"></script>

模板引擎

  1. 安装 egg-view-nunjucks 模板插件(中间件)
  2. 启用插件
  3. 配置模板
  4. view 编写模板
  5. controller控制器
  1. npm i egg-view-nunjucks

启用插件

{ROOT}/config/plugin.js

  1. exports.nunjucks = {
  2. enable: true,
  3. package: 'egg-view-nunjucks'
  4. }

配置模板

{ROOT}/config/config.default.js

mysql

安装msyql

  1. npm i egg-mysql -S

启用插件:config/plugin.js 启用 mysql插件

  1. exports.mysql = {
  2. enable: true,
  3. package: 'egg-mysql'
  4. }

配置数据源

  1. config.mysql = {
  2. client: {
  3. host: 'localhost',
  4. user: 'root',
  5. password: '',
  6. port: 3306,
  7. database: 'koa-cms'
  8. },
  9. app: true, // mysql 属性挂载到 app上,默认开启
  10. agent: false, // 是否加载到 agent 上,默认关闭
  11. }

service请求数据库

app/service/news.js

  1. const Service = require('egg').Service;
  2. class NewsService extends Service {
  3. async getList (num=1, size) {
  4. const { ctx, config, app } = this
  5. // 请求其他接口
  6. const res = await ctx.curl(config.news.url, {
  7. method: 'GET',
  8. data: {
  9. pageNum: num,
  10. pageSize: size
  11. },
  12. dataType: 'json' // 不写默认 buffer
  13. })
  14. return res.data.data
  15. // 请求 mysql数据库
  16. return await app.mysql.query('select * from news')
  17. }
  18. }
  19. module.exports = NewsService

schedule计划任务

会有许多场景需要执行一些定时的计划任务,例如:

  1. 定时上报应用状态
  2. 定时从远程接口更新本地缓存
  3. 定时进行文件切割,临时文件删除

编写定时任务

  1. 所有的定时任务都需要统一放在 app/schedule目录下
  2. 每一个文件都是一个独立的定时任务,可以配置定时任务的属性
  3. app/schedule/update_cache.js
    1. app/schedule 是固定的
  4. 执行日志输出到目录
    • ${appInfo.root}/logs/{app_name}/egg-schedule.log

node下面挂个 nginx,nginx下挂载4个服务器,通过 nginx来分发

  1. /**
  2. * 在 app应用上放置一个本地缓存,每隔一分钟,向接口请求更新
  3. */
  4. const Subscription = require('egg').Subscription
  5. class UpdateCache extends Subscription {
  6. // 通过 schedule 属性来设置定时任务的执行间隔等配置
  7. static get schedule () {
  8. return {
  9. // 每隔一分钟执行一次, 1s 一秒, 1h 一小时, 100 毫秒
  10. interval: '1m',
  11. // worker 在某一个进程中执行这个任务;all 在所有的进程中执行
  12. // worker 每台机器上只有一个 worker 会执行这个定时任务,每次执行定时任务的 worker 的选择是随机的。
  13. // all 每台机器上的每个 worker 都会执行这个定时任务
  14. type: 'all'
  15. }
  16. }
  17. // 真正的定时任务执行时,被运行的函数
  18. async subscribe () {
  19. const { ctx, config } = this
  20. const res = await ctx.curl(config.cache.url, {
  21. dataType: 'json'
  22. })
  23. this.ctx.app.cache = res.data // 拿到响应体
  24. console.log('update_schedule', res.data, this)
  25. }
  26. }
  27. module.exports = UpdateCache

egg资料

  1. egg文档
  2. 基于 koa开发,内置多进程管理
  3. 渐进式开发,框架稳定,测试覆盖率高
  4. 可扩展的插件机制,提供基于 egg定制上层插件的能力

eggjs缺点

  1. eggjs 给出的是一个企业级别的框架,是一个宏大的架子,怎么写代码并没有限定,例如:
    • 没有给出像ThinkPHP、SpringBoot、Flask框架中那些及其有用工具类、校验器、DAO操作;
    • 针对 API优化的异常处理
    • ORM层也没有给出范例代码
  2. eggjs 不是为了打造好用的框架,解决的问题是在企业级别的角度
  3. eggjs 丢失了很多细节,web框架都必备的,比如验证层,验证器,egg是没有的
    • 数据层 DAO,egg框架并没有一个解决方案,还需要自己来完成
    • 比如:安全方面的校验

egg错误

  1. [cfork:master:8167] don’t fork new work (refork: false)