Prechádzať zdrojové kódy

fix: 悬空 symlink 导致预览重新创建失败

- createAssetsSymlink: 用 try-lstat 替代 existsSync 检测旧 symlink
- 原因: 删除创意后 symlink 目标不存在,existsSync 返回 false
  导致清理逻辑跳过,symlinkSync 报 EEXIST
guoziyun 3 týždňov pred
rodič
commit
e033371008

+ 1 - 1
platform/server/dist/services/configGenerator.d.ts.map

@@ -1 +1 @@
-{"version":3,"file":"configGenerator.d.ts","sourceRoot":"","sources":["../../src/services/configGenerator.ts"],"names":[],"mappings":"AAMA,UAAU,aAAa;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAuD7D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAgBhF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAO5C"}
+{"version":3,"file":"configGenerator.d.ts","sourceRoot":"","sources":["../../src/services/configGenerator.ts"],"names":[],"mappings":"AAMA,UAAU,aAAa;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAuD7D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAkBhF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAO5C"}

+ 5 - 2
platform/server/dist/services/configGenerator.js

@@ -73,8 +73,8 @@ function generateAdConfig(input) {
 function createAssetsSymlink(creativeId, storageDir) {
     const symlinkPath = path_1.default.join(TEMPLATE_DIR, "assets", "user");
     const targetPath = path_1.default.join(storageDir, "creatives", creativeId, "assets");
-    // 清理旧的 symlink
-    if (fs_1.default.existsSync(symlinkPath)) {
+    // 清理旧的 symlink(用 try-lstat 而非 existsSync,因为悬空 symlink 的 existsSync 返回 false)
+    try {
         const stat = fs_1.default.lstatSync(symlinkPath);
         if (stat.isSymbolicLink()) {
             fs_1.default.unlinkSync(symlinkPath);
@@ -83,6 +83,9 @@ function createAssetsSymlink(creativeId, storageDir) {
             fs_1.default.rmSync(symlinkPath, { recursive: true, force: true });
         }
     }
+    catch {
+        // 路径不存在,无需清理
+    }
     fs_1.default.symlinkSync(targetPath, symlinkPath, "dir");
     console.log(`[config] Symlink created: ${symlinkPath} → ${targetPath}`);
 }

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
platform/server/dist/services/configGenerator.js.map


+ 4 - 2
platform/server/src/services/configGenerator.ts

@@ -82,14 +82,16 @@ export function createAssetsSymlink(creativeId: string, storageDir: string): voi
   const symlinkPath = path.join(TEMPLATE_DIR, "assets", "user");
   const targetPath = path.join(storageDir, "creatives", creativeId, "assets");
 
-  // 清理旧的 symlink
-  if (fs.existsSync(symlinkPath)) {
+  // 清理旧的 symlink(用 try-lstat 而非 existsSync,因为悬空 symlink 的 existsSync 返回 false)
+  try {
     const stat = fs.lstatSync(symlinkPath);
     if (stat.isSymbolicLink()) {
       fs.unlinkSync(symlinkPath);
     } else {
       fs.rmSync(symlinkPath, { recursive: true, force: true });
     }
+  } catch {
+    // 路径不存在,无需清理
   }
 
   fs.symlinkSync(targetPath, symlinkPath, "dir");

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov