fix(snapshot): 修复 6 个 TypeScript 严格模式编译错误

- infrastructure.module: handler union type 修正
- minio-storage.adapter: obj.name 可选属性安全检查
- minio-backup.handler: listAllObjects 返回 string[] 避免 BucketItem.name 可选问题

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-02-23 23:10:08 -08:00
parent 18c9f8b389
commit 685aced4e4
3 changed files with 15 additions and 14 deletions

View File

@ -70,17 +70,18 @@ export class MinioBackupHandler implements BackupHandler {
onProgress(5, `${totalObjects} 个对象待下载...`); onProgress(5, `${totalObjects} 个对象待下载...`);
for (const bucket of bucketsToBackup) { for (const bucket of bucketsToBackup) {
const bucketDir = path.join(tempDownloadDir, bucket.name); const bucketName = bucket.name;
const bucketDir = path.join(tempDownloadDir, bucketName);
fs.mkdirSync(bucketDir, { recursive: true }); fs.mkdirSync(bucketDir, { recursive: true });
const objects = await this.listAllObjects(bucket.name); const objects = await this.listAllObjects(bucketName);
for (const obj of objects) { for (const objName of objects) {
const objectDir = path.join(bucketDir, path.dirname(obj.name)); const objectDir = path.join(bucketDir, path.dirname(objName));
fs.mkdirSync(objectDir, { recursive: true }); fs.mkdirSync(objectDir, { recursive: true });
const objectPath = path.join(bucketDir, obj.name); const objectPath = path.join(bucketDir, objName);
const dataStream = await this.minioClient.getObject(bucket.name, obj.name); const dataStream = await this.minioClient.getObject(bucketName, objName);
const writeStream = fs.createWriteStream(objectPath); const writeStream = fs.createWriteStream(objectPath);
await new Promise<void>((resolve, reject) => { await new Promise<void>((resolve, reject) => {
@ -92,7 +93,7 @@ export class MinioBackupHandler implements BackupHandler {
downloadedObjects++; downloadedObjects++;
const percent = 5 + Math.floor((downloadedObjects / totalObjects) * 70); const percent = 5 + Math.floor((downloadedObjects / totalObjects) * 70);
onProgress(percent, `下载对象 ${downloadedObjects}/${totalObjects}: ${bucket.name}/${obj.name}`); onProgress(percent, `下载对象 ${downloadedObjects}/${totalObjects}: ${bucketName}/${objName}`);
} }
} }
@ -123,12 +124,12 @@ export class MinioBackupHandler implements BackupHandler {
} }
} }
private async listAllObjects(bucket: string): Promise<Minio.BucketItem[]> { private async listAllObjects(bucket: string): Promise<string[]> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const objects: Minio.BucketItem[] = []; const names: string[] = [];
const stream = this.minioClient.listObjects(bucket, '', true); const stream = this.minioClient.listObjects(bucket, '', true);
stream.on('data', (obj) => objects.push(obj)); stream.on('data', (obj) => { if (obj.name) names.push(obj.name); });
stream.on('end', () => resolve(objects)); stream.on('end', () => resolve(names));
stream.on('error', reject); stream.on('error', reject);
}); });
} }

View File

@ -47,10 +47,10 @@ import { BackupTarget } from '@/domain/enums';
.filter(Boolean); .filter(Boolean);
const allHandlers = [pg, redis, kafka, zk, minio, uploads]; const allHandlers = [pg, redis, kafka, zk, minio, uploads];
const handlerMap = new Map<BackupTarget, typeof pg>(); const handlerMap = new Map<BackupTarget, PostgresBackupHandler | RedisBackupHandler | KafkaBackupHandler | ZookeeperBackupHandler | MinioBackupHandler | UploadsBackupHandler>();
for (const handler of allHandlers) { for (const handler of allHandlers) {
if (availableTargets.includes(handler.target)) { if (availableTargets.includes(handler.target as string)) {
handlerMap.set(handler.target, handler); handlerMap.set(handler.target, handler);
} }
} }

View File

@ -75,7 +75,7 @@ export class MinioStorageAdapter implements OnModuleInit {
const stream = this.minioClient.listObjects(this.bucketName, prefix, true); const stream = this.minioClient.listObjects(this.bucketName, prefix, true);
await new Promise<void>((resolve, reject) => { await new Promise<void>((resolve, reject) => {
stream.on('data', (obj) => objects.push(obj.name)); stream.on('data', (obj) => { if (obj.name) objects.push(obj.name); });
stream.on('end', resolve); stream.on('end', resolve);
stream.on('error', reject); stream.on('error', reject);
}); });