@tuia/tuia-egg
v1.6.1
Published
tuia-egg framework
Downloads
18
Readme
tuia-egg
tuia-egg framework
QuickStart
- yarn global add tuia-cli
- tuia-cli init <项目名>
- cd <项目名>
- yarn
- yarn dev
OS Support
- windows
- linux
- macOS
vscode插件(建议安装)
申请容器规范
- Node容器部署流程说明书(请查阅容器申请部分)
目录、代码规范
祥见egg目录结构
Use Logger
// 日志级别分为debug info warn error
// app对象(常用于middleware, app生命周期内)
this.app.TuiaLogger.info('category', '日志内容');
// ctx对象(常用于controller, service)
this.ctx.TuiaLogger.info('category', '日志内容');
// 全局使用
global.TuiaLogger.info('category', '日志内容');
Use BiLogger
// 日志不分级别,统一使用info
// group: node日志一般固定10,type: 区分不同需求,json: 具体日志数据.
// app对象(常用于middleware, app生命周期内)
this.app.BiLogger.info({group: 10, type: 1, json: {key: value}});
// ctx对象(常用于controller, service)
this.ctx.BiLogger.info({group: 10, type: 1, json: {key: value}});
// 全局使用
global.TuiaLogger.info({group: 10, type: 1, json: {key: value}});
## Use ERRCODE
```js
// controller(建议在controller书写响应)
// 成功返回
this.ctx.success({
desc: 'desc',
data: {
list: [],
count: 0
}
})
// 失败返回
this.ctx.fail({
error: this.ctx.ERRCODE.SYSTEM_ERROR,
desc: '重写错误描述'
})
// 如何自定义
// 只要满足error既定的数据结构即可,结构如下
exports.SYSTEM_ERROR = {
code: 999999,
desc: '系统错误',
};
Use Eureka
// How to config
// config.default.js
config.eureka = {
services: ['TUIA-ADVERT-CENTER']
}
// How to use
// service(建议在service中书写具体业务逻辑)
this.app.Eureka.getHost('TUIA-ADVERT-CENTER')
OR
global.Eureka.getHost('TUIA-ADVERT-CENTER')
注意
如果本地启服务注册到开发环境,访问开发环境域名会有流量分流到本地来,请注意!!!
Use Proxy
// config/config.default.js
config.proxy = {
filter (pathname, req) {
return pathname.match('^/proxytest') && req.method === 'GET'
},
options: {
// 默认target,实际没有用,因为使用router来做动态target
target: 'http://www.baidu.com',
router(req) {
return global.Eureka.getHost('TUIA-ACTIVITY-WEB')
},
pathRewrite: {
'^/proxytest': ''
},
changeOrigin: true
}
}
Use SSO And JWT/Cookie-Session
config.sso = {
// 项目系统id,查找地址是 http://sso.duiba.com.cn/ui#/permissionSystem/applications/appList,输入系统名称后查询前面的ID
systemId: 214,
// 项目名
systemName: 'tuia-jssdk-manage-node',
// 对应环境上的加密密钥,这里以开发环境为例
// http://console.duibadev.com.cn/apollo/#/service/applications/tuia-worktable-node/accessKey
accessKey: 'a6fa0e0307b84d90835fc600fa831c84',
// 过滤接口,不走sso拦截器用
filters: []
};
验证流程
- npm run dev
- 访问http://localhost:3000
- 走登录->sso登录->登出
使用JWT
- 框架已将jwt的值存储在localStorage中
- 请求头需要增加jwt请求头作用户会话校验。比如jwt: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
使用Cookie
- 服务端直接通过HTTP协议操作Cookie即可
注意
如果使用JWT方案,当用户信息失效(比如修改密码)或提前过期(比如修改用户名、生日等)时,需要前端代码配合清除缓存的jwt从而走重新签发jwt的流程以更新信息。如果使用Cookie-Session方案则清除服务端(或者redis)session即可。
Use Config Center
// https://console.duibadev.com.cn/apollo/#/service/applications/config/tuia-jimu-web-node
// 取对应环境(默认为dev)对应工程(一般对应package.json的name值)的所有配置
let allConfig = global.getFromConfigCenter();
// 取单个配置。返回明文(无论是否加密)
let configValue = global.getFromConfigCenter('key');
Use IP
// config/config.default.js
config.proxy = true;
config.maxProxyCount = 1;
// use ctx
this.ctx.ip // 获取用户的 IP 地址
this.ctx.host // 获取用户请求的域名
this.ctx.protocol // 获取用户请求的协议
Use CORS
// config/plugin.js
exports.cors = {
enable: true,
package: 'egg-cors',
};
// config/config.default.js
// 支持跨域域名
exports.security = {
// domainWhiteList: [ 'http://localhost:4200' ],
};
// 支持跨域,若设置origin,则security中的白名单失效
exports.cors = {
// {string|Function} origin: '*',
// {string|Array} allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH'
};
Use Cat
class HomeController extends Controller {
async index() {
this.ctx.body = 'hi, egg';
// 获取初始化好的cat对象
let cat = this.ctx.app.catClient;
threadCat = new cat.Cat(true);
//创建一个transaction实例
const trans = threadCat.newTransaction('TestTran', 'DDD');
//添加数据
trans.addData('key', 'value');
trans.logEvent('EventTransaction', 'E1111');
const subTrans = a.newTransaction('TestSubTran', 'GGGGG');
subTrans.addData('subKey', 'subValue');
trans.setStatus(cat.STATUS.SUCCESS);
setTimeout(function() {
trans.complete();
}, 1000);
// Event
cat.logEvent('Event', 'E1');
cat.logEvent('Event', 'E2', cat.STATUS.FAIL);
cat.logEvent('Event', 'E3', 'failed');
// Error
cat.logError('ErrorInTransaction', new Error());
}
}
module.exports = HomeController;
tuia-egg默认已统一监控所有接口请求,自动开启各环境cat,项目中无需配置。
注意事项:
config.aliyunTest.js不会覆盖config.default.js,需手动添加。
容器镜像目前状态:
node8:image-node
<node10:cat
<node10:dumb-init
<node10:gifsicle
node10:dumb-init
以后包含dumb-init
版本的镜像,更新Dockerfile
启动脚本的最后一行为ENTRYPOINT [“/usr/local/bin/dumb-init”, “node”, “server”]
目的是解决puppeteer
在docker
中运行时的僵尸进程。cat装包问题,待解决,目前手动解决方案流程。
cpu核数根据部署的容器环境而定,假如
APP_CPU
环境变量缺失,默认1核。多核场景需注意定时任务的运用,详见egg定时任务。