eggjs / eggjs/egg

如何在config.default.ts 中获取 app 对象?

Open
#5,250 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
TypeScript
Stars
19k
Forks
1.8k
PR merge metrics
No merged PRs in 30d

Description

### 请详细告知你的新点子(Nice Ideas):

我正在开发一个消息队列封装的插件,遇到了如下问题:

1. 向 app 挂载 consumer 实例,实例化 consumer 时需要提供 ctx,目前工作正常:

```typescript
// {plugin}/app.ts
module.exports = (app: Application) => {
const consumerDir = path.join(app.baseDir, 'app/consumer');
app.loader.loadToApp(consumerDir, 'consumer', {
caseStyle: 'upper',
initializer(factory: new (ctx: Context, redis: Redis, options: ConsumerOptions) => Consumer) {
const ctx = app.createAnonymousContext();
return new factory(ctx, app.redis, app.config.consumer[factory.name]);
},
});
};
```

2. 向 app 挂载 producer 实例,producer 需要在其他文件中调用(例如 controller 或 service),为了提供类型提示,我使用了 config.customLoader 来自动生成 d.ts,但我仍需提供 ctx 实例,我却无法拿到 app 去创建它:

```typescript
// {plugin}/config/config.default.ts
export default () => {
const config = {} as PowerPartial;

config.customLoader = {
producer: {
directory: 'app/producer',
inject: 'app',
caseStyle: 'upper',
initializer(factory: typeof Producer) {
// 我应当用什么方式获取 app 呢?
const ctx = app.createAnonymousContext();
return new factory(ctx, app.redis, app.config.producer[factory.name]);
},
},
};
return config;
};
```

我查看了部分源码,发现此处如果 `inject.length !== 0` 就不会向 `config.default.ts` 中注入 app 对象了。

![image](https://github.com/eggjs/egg/assets/23334732/1fb97d16-96a7-4beb-bda4-e595af4cbe9c)

请问我是有其他方式在 `config.default.ts` 中拿到 app 呢,还是可以在 `app.ts` 中通过一些 api 提供 ts 类型提示呢?

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.