使用 Egg.js 做店铺装修 BFF 层
date
Sep 9, 2021
slug
use-eggjs-create-bff
status
Published
tags
Nodejs
Egg.js
跨境电商
summary
主要从架构的角度考虑搭建项目时需要注意的问题以及整个流程
type
Post
需要考虑的问题
- 路由
- cookie
- session
- 表单、登陆、表单csrf安全等
- 缓存
- 多线程(数据共享)
- http全链路标识
- log
- database&cdn
入口(app/agent)
- tplconfig更新通过app、agent俩个线程(egg)提供,通信即可。agent订阅redis缓存的更新服务,记得在引入redis的config中开启
agent: true
,一旦agent接收到更新就发送消息给主进程 app
- 利用app中的beforeStart钩子来初始化全局变量:tplConfig/tcuptime
config
可以进行相应的配置,如果想自定义变量并导出可以参见 confid.default.js 中的 apiConfig
middleware
- auth 鉴权
- common 放置一些全局变量区别与全局的app变量,middleware只是在有路变化时载入,这里放置siteid以及全链路的requestid(检测、debug),每次都去拉 tplconfig 并且把该变量放入 app.locals中(在appjs中初始化,在这里赋值)
extend
- 直接在对应的全局对象上进行扩展方便逻辑编写,比如:在context上重写了模版的render方法,为了动态加载主题的名称
this.getTplConfig().name
可以获取当前是 default 主题还是其他主题;添加了获取 tplconfig 的方法
- helper中都是辅助方法
error
重写了egg的错误提示方法,把错误信息和自定义code都打印出来
提示
tplconfig的更新:
- 订阅redis更新 app.js&agent.js
- 主动从oss拉取 service/base.js => fetchTplConfig => this.ctx.oss.get
- 主动通过接口拉 service/base.js => fetchTplConfig => apisdk siteId的设置:在middleware/common => ctx.request.siteId = siteId;