0%

egg.js 笔记

egg.js 笔记

内置对象

关于 app, ctx, helper, config, logger 的详细介绍:
官网链接

拓展

记一下经常容易弄错的 logger 对象

  • App Logger
    我们可以通过 app.logger 来获取到它,如果我们想做一些应用级别的日志记录,如记录启动阶段的一些数据信息,记录一些业务上与请求无关的信息,都可以通过 App Logger 来完成。

  • Context Logger
    我们可以通过 ctx.logger 从 Context 实例上获取到它,从访问方式上我们可以看出来,Context Logger 一定是与请求相关的,它打印的日志都会在前面带上一些当前请求相关的信息(如 [$userId/$ip/$traceId/${cost}ms $method $url]),通过这些信息,我们可以从日志快速定位请求,并串联一次请求中的所有的日志。

  • Controller Logger & Service Logger
    我们可以在 Controller 和 Service 实例上通过 this.logger 获取到它们,它们本质上就是一个 Context Logger,不过在打印日志的时候还会额外的加上文件路径,方便定位日志的打印位置。

由此可见,如果想看到http请求的参数和路径,还有打印logger的文件就使用this.logger(ctx.logger多一个文件路径),如果只是打印和请求无关的日志,使用app.logger

总结:

在 controller和service 里比较推荐使用 ctx.logger,这样可以获取当前请求的相关信息,比较容易定位 bug.
在其他和业务无关的地方用 app.logger 就好了

Application

application 是一个全局应用对象,而且在一个应用中只会被实例化一次.也就相当于是一个全局对象,如果把某对象挂在 app 下,可能会造成全局污染.

Config

配置加载顺序

应用、插件、框架都可以定义这些配置,而且目录结构都是一致的,但存在优先级(应用 > 框架 > 插件),相对于此运行环境的优先级会更高。

比如在 prod 环境加载一个配置的加载顺序如下,后加载的会覆盖前面的同名配置。

-> 插件 config.default.js
-> 框架 config.default.js
-> 应用 config.default.js
-> 插件 config.prod.js
-> 框架 config.prod.js
-> 应用 config.prod.js

获取方式:

我们可以通过 app.config 从 Application 实例上获取到 config 对象,也可以在 Controller, Service, Helper 的实例上通过 this.config 获取到 config 对象。

Subscription

egg 还提供了订阅模式的基类,如果需要使用订阅模式,那调用这个类,然后继承并实现就好了

可以通过以下方式来引用 Subscription 基类:

1
2
3
4
5
6
7
const Subscription = require('egg').Subscription;

class Schedule extends Subscription {
// 需要实现此方法
// subscribe 可以为 async function 或 generator function
async subscribe() {}
}