From e00cbb71c5bbd9db218cfb4340380c7a9586f4be Mon Sep 17 00:00:00 2001 From: hailin Date: Fri, 6 Mar 2026 09:03:14 -0800 Subject: [PATCH] =?UTF-8?q?fix(admin-service):=20=E4=BF=AE=E5=A4=8D=20APK?= =?UTF-8?q?=20=E8=A7=A3=E6=9E=90=E5=A4=B1=E8=B4=A5=20=E2=80=94=20=E5=86=99?= =?UTF-8?q?=E5=85=A5=E4=B8=B4=E6=97=B6=E6=96=87=E4=BB=B6=E5=90=8E=E5=86=8D?= =?UTF-8?q?=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit adbkit-apkreader v3 底层使用 yauzl.open(),只接受文件路径, 传入 Buffer 会被当成文件路径字符串导致 ENOENT。 改为先将 Buffer 写入 os.tmpdir() 临时文件,解析完成后在 finally 中删除。 Co-Authored-By: Claude Sonnet 4.6 --- .../infrastructure/parsers/package-parser.service.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/backend/services/admin-service/src/infrastructure/parsers/package-parser.service.ts b/backend/services/admin-service/src/infrastructure/parsers/package-parser.service.ts index df02f6f..e476309 100644 --- a/backend/services/admin-service/src/infrastructure/parsers/package-parser.service.ts +++ b/backend/services/admin-service/src/infrastructure/parsers/package-parser.service.ts @@ -1,3 +1,6 @@ +import * as fs from 'fs'; +import * as os from 'os'; +import * as path from 'path'; import { Injectable, Logger, BadRequestException } from '@nestjs/common'; import { IPackageParser, ParsedPackageInfo } from '../../domain/ports/package-parser.interface'; @@ -13,10 +16,13 @@ export class PackageParserService implements IPackageParser { } private async parseApk(buffer: Buffer): Promise { + // adbkit-apkreader v3 底层用 yauzl.open(),只接受文件路径而非 Buffer + // 先写入临时文件,解析后删除 + const tmpFile = path.join(os.tmpdir(), `apk-parse-${Date.now()}.apk`); try { - // Dynamic import to handle missing dependency gracefully + fs.writeFileSync(tmpFile, buffer); const ApkReader = await import('adbkit-apkreader').then(m => m.default || m); - const reader = await ApkReader.open(buffer); + const reader = await ApkReader.open(tmpFile); const manifest = await reader.readManifest(); return { packageName: manifest.package || 'unknown', @@ -33,6 +39,8 @@ export class PackageParserService implements IPackageParser { versionName: '0.0.0', platform: 'ANDROID', }; + } finally { + try { fs.unlinkSync(tmpFile); } catch { /* ignore */ } } }