eggjs技术栈
egg框架扩展

egg入门
- 初始化 eggjs项目
 - 配置路由
 - 静态文件中间件
 - 模板引擎
 - 远程服务接口
 - 扩展工具方法
 - 单元测试
 
运行环境
- config.dev.js 会覆盖 config.default.js
- 先执行 default.js,后执行其他环境
 
 set EGG_SERVER_ENV = prod设置环境变量
config.default.js // 默认环境config.dev.js // 开发环境config.prod.js // 正式环境
- package.json
- mac 和 win10环境不一样,用 cross-env, 跨操作系统设置环境变量
 npm install cross-env -D
 
"scripts": {"dev": "`set EGG_SERVER_ENV=dev && egg-bin dev","start": "`set EGG_SERVER_ENV=prod && egg-scripts start",}
tree显示树状结构
-I命令,使用正则匹配来排除掉的文件夹- 使用
|同时排除掉多个文件夹 
tree -I "node_modules|cache|test_*" -L 3tree -I "node_modules"# 最后一个使用到正则匹配,这样以test_开头的文件夹都不会被显示出来tree -I "node_modules|cache|test_*"# 只看两级目录tree -L 2
eggjs中间件
- npm 安装插件
 - config/plugin.js 启用插件
 
静态文件中间件
- egg内置了 static插件
 - static默认映射 
public->app/public/目录 - 把静态资源都放到 
app/public/目录 
<link href="/public/css/bootstrap.min.css" rel="stylesheet"><script src="/public/js/bootstrap.min.js"></script>
模板引擎
- 安装 egg-view-nunjucks 模板插件(中间件)
 - 启用插件
 - 配置模板
 - view 编写模板
 - controller控制器
 
npm i egg-view-nunjucks
启用插件
{ROOT}/config/plugin.js
exports.nunjucks = {enable: true,package: 'egg-view-nunjucks'}
配置模板
{ROOT}/config/config.default.js
mysql
安装msyql
npm i egg-mysql -S
启用插件:config/plugin.js 启用 mysql插件
exports.mysql = {enable: true,package: 'egg-mysql'}
配置数据源
config.mysql = {client: {host: 'localhost',user: 'root',password: '',port: 3306,database: 'koa-cms'},app: true, // mysql 属性挂载到 app上,默认开启agent: false, // 是否加载到 agent 上,默认关闭}
service请求数据库
app/service/news.js
const Service = require('egg').Service;class NewsService extends Service {async getList (num=1, size) {const { ctx, config, app } = this// 请求其他接口const res = await ctx.curl(config.news.url, {method: 'GET',data: {pageNum: num,pageSize: size},dataType: 'json' // 不写默认 buffer})return res.data.data// 请求 mysql数据库return await app.mysql.query('select * from news')}}module.exports = NewsService
schedule计划任务
会有许多场景需要执行一些定时的计划任务,例如:
- 定时上报应用状态
 - 定时从远程接口更新本地缓存
 - 定时进行文件切割,临时文件删除
 
编写定时任务
- 所有的定时任务都需要统一放在 
app/schedule目录下 - 每一个文件都是一个独立的定时任务,可以配置定时任务的属性
 - app/schedule/update_cache.js
- app/schedule 是固定的
 
 - 执行日志输出到目录
- ${appInfo.root}/logs/{app_name}/egg-schedule.log
 
 
node下面挂个 nginx,nginx下挂载4个服务器,通过 nginx来分发
/*** 在 app应用上放置一个本地缓存,每隔一分钟,向接口请求更新*/const Subscription = require('egg').Subscriptionclass UpdateCache extends Subscription {// 通过 schedule 属性来设置定时任务的执行间隔等配置static get schedule () {return {// 每隔一分钟执行一次, 1s 一秒, 1h 一小时, 100 毫秒interval: '1m',// worker 在某一个进程中执行这个任务;all 在所有的进程中执行// worker 每台机器上只有一个 worker 会执行这个定时任务,每次执行定时任务的 worker 的选择是随机的。// all 每台机器上的每个 worker 都会执行这个定时任务type: 'all'}}// 真正的定时任务执行时,被运行的函数async subscribe () {const { ctx, config } = thisconst res = await ctx.curl(config.cache.url, {dataType: 'json'})this.ctx.app.cache = res.data // 拿到响应体console.log('update_schedule', res.data, this)}}module.exports = UpdateCache
egg资料
- egg文档
 - 基于 koa开发,内置多进程管理
 - 渐进式开发,框架稳定,测试覆盖率高
 - 可扩展的插件机制,提供基于 egg定制上层插件的能力
 
eggjs缺点
eggjs给出的是一个企业级别的框架,是一个宏大的架子,怎么写代码并没有限定,例如:- 没有给出像ThinkPHP、SpringBoot、Flask框架中那些及其有用工具类、校验器、DAO操作;
 - 针对 API优化的异常处理
 - ORM层也没有给出范例代码
 
eggjs不是为了打造好用的框架,解决的问题是在企业级别的角度eggjs丢失了很多细节,web框架都必备的,比如验证层,验证器,egg是没有的- 数据层 DAO,egg框架并没有一个解决方案,还需要自己来完成
 - 比如:安全方面的校验
 
egg错误
- [cfork:master:8167] don’t fork new work (refork: false)
 
