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 3
tree -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').Subscription
class 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 } = this
const 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)