darukjs / daruk

a node.js web framework based on typescript
http://darukjs.com
MIT License
934 stars 79 forks source link

如何在timer里面读取provide注册的类 #121

Closed renaiss closed 3 years ago

renaiss commented 3 years ago

如何在DbTimer里面读取使用provide注册的Db

import { CronJob, Daruk, DarukServer, provide, inject, timer, TimerClass } from "daruk";

const main = async function () {
    try {
        const app = DarukServer();

        @provide("Db")
        class Db { }

        @timer()
        class DbTimer implements TimerClass {

            @inject("Db") private Db!: Db;

            public cronTime!: string;

            public initTimer(daruk: Daruk) {
                this.cronTime = '* * * * * *';
            }

            public onTick(cron: CronJob, daruk: Daruk) {
                console.log(this.Db);
            }
        }

        app.binding();
        app.listen(8899);

    } catch (error) {
        console.log(error);
    }
};

main(); // Error: No matching bindings found for serviceIdentifier: Db
xiaojue commented 3 years ago

你的写的没什么问题,timer 是一个 plugin,他在执行时,业务方定义的比如 provide 注入的依赖,还没有被 load,所以会报这个错。

我已经修复了,把 daruk 的 init 置后了,然后就好了,可以更新到 daruk@2.3.5 版本。

https://github.com/darukjs/daruk/commit/802e2d137c49bee1ca9aa3f5bca96ad397e99368