0

我有这个解决redis的工厂:

import {RedisClient} from "redis";

export const RedisProvider = {
    provide: 'RedisToken',
    useFactory: async () => {
        return new Promise((resolve, reject) => {
            let redisClient = new RedisClient({
                host: 'resolver_redis'
            });

            redisClient.on('ready', function () {
                resolve(redisClient);
            });
        });
    }
};

但除此之外,我想检查redis中是否存在特定的密钥,如果不存在,我想使用微服务检索它,但为此我需要注入微服务“客户端”,我想将其更改为类似的:

import {RedisClient} from "redis";

export const RedisProvider = {
    provide: 'RedisToken',
    useFactory: async () => {
        return new Promise((resolve, reject) => {
            let redisClient = new RedisClient({
                host: 'resolver_redis'
            });

            redisClient.on('ready', async function () {

                let campaigns = await redisClient.get('campaigns');

                if ( ! campaigns) {
                    // Note: "client" is not available in this scope
                    client.send('get:campaigns').subscribe(async function (campaigns) {
                        await redisClient.set('campaigns', campaigns);
                        resolve(redisClient);
                    });
                }
                else {
                    resolve(redisClient);
                }
            });
        });
    }
};

唯一的问题是我无法访问“客户端”,还是我?如果它更有意义,它也可以是另一个提供程序,但是我还需要优先加载提供程序,我这样做是因为应用程序需要这些数据来启动东西

4

1 回答 1

0

我不建议在提供者工厂中添加更多逻辑,因为它可以在此提供者的消费者中得到更多控制,即:services

在您的服务代码中,您可以执行以下操作

import { Component, Inject, OnModuleInit } from '@nestjs/common';
...
@Component()
export class MyService implements OnModuleInit {
    constructor(@Inject(REDIS_TOKEN) private readonly redis: RedisClient) {}
    onModuleInit() {
            const campaigns = await this.redis.get('campaigns');
            ...
    }
}

我假设它REDIS_TOKEN是不断保存在constants.ts文件中并且等于RedisToken.

这将受到更多控制。campaigns一旦您的模块初始化,检查密钥的代码将被执行。

有关模块生命周期结帐的更多信息:模块生命周期

于 2018-02-26T23:45:12.273 回答