提交 40c27c0c authored 作者: a's avatar a

fix(connection): close connections onModuleDestroy

上级 313f9c47
import { DynamicModule } from '@nestjs/common'; import { DynamicModule, OnModuleDestroy } from '@nestjs/common';
import { ModuleRef } from '@nestjs/core';
import { RedisModuleAsyncOptions, RedisModuleOptions } from './redis.interface'; import { RedisModuleAsyncOptions, RedisModuleOptions } from './redis.interface';
export declare class RedisCoreModule { export declare class RedisCoreModule implements OnModuleDestroy {
private readonly options;
private readonly moduleRef;
constructor(options: RedisModuleOptions | RedisModuleOptions[], moduleRef: ModuleRef);
static register(options: RedisModuleOptions | RedisModuleOptions[]): DynamicModule; static register(options: RedisModuleOptions | RedisModuleOptions[]): DynamicModule;
static forRootAsync(options: RedisModuleAsyncOptions): DynamicModule; static forRootAsync(options: RedisModuleAsyncOptions): DynamicModule;
onModuleDestroy(): Promise<void>;
} }
...@@ -5,13 +5,32 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key, ...@@ -5,13 +5,32 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r; return c > 3 && r && Object.defineProperty(target, key, r), r;
}; };
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __param = (this && this.__param) || function (paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); }
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
var RedisCoreModule_1; var RedisCoreModule_1;
const common_1 = require("@nestjs/common"); const common_1 = require("@nestjs/common");
const core_1 = require("@nestjs/core");
const redis_client_provider_1 = require("./redis-client.provider"); const redis_client_provider_1 = require("./redis-client.provider");
const redis_constants_1 = require("./redis.constants"); const redis_constants_1 = require("./redis.constants");
const redis_service_1 = require("./redis.service"); const redis_service_1 = require("./redis.service");
let RedisCoreModule = RedisCoreModule_1 = class RedisCoreModule { let RedisCoreModule = RedisCoreModule_1 = class RedisCoreModule {
constructor(options, moduleRef) {
this.options = options;
this.moduleRef = moduleRef;
}
static register(options) { static register(options) {
return { return {
module: RedisCoreModule_1, module: RedisCoreModule_1,
...@@ -30,12 +49,33 @@ let RedisCoreModule = RedisCoreModule_1 = class RedisCoreModule { ...@@ -30,12 +49,33 @@ let RedisCoreModule = RedisCoreModule_1 = class RedisCoreModule {
exports: [redis_service_1.RedisService], exports: [redis_service_1.RedisService],
}; };
} }
onModuleDestroy() {
return __awaiter(this, void 0, void 0, function* () {
const closeConnection = ({ clients, defaultKey }) => (options) => __awaiter(this, void 0, void 0, function* () {
const name = options.name || defaultKey;
const client = clients.get(name);
if (client && !options.keepAlive) {
yield client.disconnect();
}
});
const redisClient = this.moduleRef.get(redis_constants_1.REDIS_CLIENT);
const closeClientConnection = closeConnection(redisClient);
if (Array.isArray(this.options)) {
yield Promise.all(this.options.map(closeClientConnection));
}
else {
yield closeClientConnection(this.options);
}
});
}
}; };
RedisCoreModule = RedisCoreModule_1 = __decorate([ RedisCoreModule = RedisCoreModule_1 = __decorate([
common_1.Global(), common_1.Global(),
common_1.Module({ common_1.Module({
providers: [redis_service_1.RedisService], providers: [redis_service_1.RedisService],
exports: [redis_service_1.RedisService], exports: [redis_service_1.RedisService],
}) }),
__param(0, common_1.Inject(redis_constants_1.REDIS_MODULE_OPTIONS)),
__metadata("design:paramtypes", [Object, core_1.ModuleRef])
], RedisCoreModule); ], RedisCoreModule);
exports.RedisCoreModule = RedisCoreModule; exports.RedisCoreModule = RedisCoreModule;
import { DynamicModule, Global, Module } from '@nestjs/common'; import {
DynamicModule,
Global,
Module,
Inject,
OnModuleDestroy,
} from '@nestjs/common';
import { ModuleRef } from '@nestjs/core';
import { RedisModuleAsyncOptions, RedisModuleOptions } from './redis.interface'; import { RedisModuleAsyncOptions, RedisModuleOptions } from './redis.interface';
import { import {
createAsyncClientOptions, createAsyncClientOptions,
createClient, createClient,
RedisClient,
} from './redis-client.provider'; } from './redis-client.provider';
import { REDIS_MODULE_OPTIONS } from './redis.constants'; import { REDIS_MODULE_OPTIONS, REDIS_CLIENT } from './redis.constants';
import { RedisService } from './redis.service'; import { RedisService } from './redis.service';
@Global() @Global()
...@@ -13,7 +21,13 @@ import { RedisService } from './redis.service'; ...@@ -13,7 +21,13 @@ import { RedisService } from './redis.service';
providers: [RedisService], providers: [RedisService],
exports: [RedisService], exports: [RedisService],
}) })
export class RedisCoreModule { export class RedisCoreModule implements OnModuleDestroy {
constructor(
@Inject(REDIS_MODULE_OPTIONS)
private readonly options: RedisModuleOptions | RedisModuleOptions[],
private readonly moduleRef: ModuleRef,
) {}
static register( static register(
options: RedisModuleOptions | RedisModuleOptions[], options: RedisModuleOptions | RedisModuleOptions[],
): DynamicModule { ): DynamicModule {
...@@ -35,4 +49,24 @@ export class RedisCoreModule { ...@@ -35,4 +49,24 @@ export class RedisCoreModule {
exports: [RedisService], exports: [RedisService],
}; };
} }
async onModuleDestroy() {
const closeConnection = ({ clients, defaultKey }) => async options => {
const name = options.name || defaultKey;
const client = clients.get(name);
if (client && !options.keepAlive) {
await client.disconnect();
}
};
const redisClient = this.moduleRef.get<RedisClient>(REDIS_CLIENT);
const closeClientConnection = closeConnection(redisClient);
if (Array.isArray(this.options)) {
await Promise.all(this.options.map(closeClientConnection));
} else {
await closeClientConnection(this.options);
}
}
} }
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
}, },
"dependencies": { "dependencies": {
"@nestjs/common": "6.3.1", "@nestjs/common": "6.3.1",
"@nestjs/core": "^6.6.7",
"@types/ioredis": "^4.0.4", "@types/ioredis": "^4.0.4",
"@types/uuid": "^3.4.4", "@types/uuid": "^3.4.4",
"ioredis": "^4.2.0", "ioredis": "^4.2.0",
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论