From bc0ed3fcd89d819d3a77648f97d4cf6816adb1b8 Mon Sep 17 00:00:00 2001 From: yu <191972707@qq.com> Date: Fri, 30 Oct 2026 10:40:04 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=96=87=E4=BB=B6/FTP=E5=AE=9E=E6=B5=8B?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=89=E5=A4=84=E7=9C=9FBug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - windows-system.ts: File_OpenFile 打开文件夹时 explorer.exe 成功也返回退出码1, 放行该退出码(实测验证) - ftp.ts: FTP_CreateDir 的 cd() 改为 await, 消除 basic-ftp 并发冲突(launched a task while another one is still running, 实测验证) - flowValidation.ts: flow.variables 空值防御, 避免旧流程JSON缺字段时渲染崩溃 实测: FileTest 32/32, FtpTest 10/10 全部通过 --- src/main/capabilities/ftp.ts | 4 +++- src/main/capabilities/windows-system.ts | 8 +++++++- src/renderer/src/validation/flowValidation.ts | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/capabilities/ftp.ts b/src/main/capabilities/ftp.ts index d707fcd..e5a6012 100644 --- a/src/main/capabilities/ftp.ts +++ b/src/main/capabilities/ftp.ts @@ -111,7 +111,9 @@ register("FTP_CreateDir", async (ctx, node, args) => { const client = await requireClient(node.id); const dir = requireText(args, ["dirname"], "目录名", node.id); await client.ensureDir(dir); - client.cd(dir).catch(() => {}); + // 创建后进入该目录;必须 await,否则下个节点的命令与本次 cd 并发, + // basic-ftp 会以 "task while another one is still running" 关闭客户端 + await client.cd(dir).catch(() => {}); ctx.log("已创建目录:" + dir, "info", node.id); return { created: true, dir }; }); diff --git a/src/main/capabilities/windows-system.ts b/src/main/capabilities/windows-system.ts index 0760bb5..d611206 100644 --- a/src/main/capabilities/windows-system.ts +++ b/src/main/capabilities/windows-system.ts @@ -87,6 +87,12 @@ register("System_SetInputMethodState", async (ctx, node, args) => { register("File_OpenFile", async (ctx, node, args) => { const p = reqText(args, ["path"], "文件夹路径", node.id); - await run("explorer.exe", [p], { windowsHide: true }); + try { + await run("explorer.exe", [p], { windowsHide: true }); + } catch (error) { + // explorer.exe 打开成功也会返回退出码 1(Windows 已知行为),仅路径不存在时才是真失败 + const code = (error as { code?: unknown }).code; + if (code !== 1) throw error; + } return { opened: true, path: p }; }); diff --git a/src/renderer/src/validation/flowValidation.ts b/src/renderer/src/validation/flowValidation.ts index ab5d142..add8a85 100644 --- a/src/renderer/src/validation/flowValidation.ts +++ b/src/renderer/src/validation/flowValidation.ts @@ -56,7 +56,7 @@ export function validateFlow(flow: FlowDefinition, catalog: Catalog): FlowValida } const definedVars = new Set([ - ...flow.variables.map((item) => item.name), + ...(flow.variables ?? []).map((item) => item.name), ...flow.nodes.map((node) => node.options?.outputVar).filter(Boolean) as string[] ]); const variableRef = /\$\{\s*([A-Za-z_\u4e00-\u9fa5][\w\u4e00-\u9fa5]*)\s*(?:\.[A-Za-z_]\w*)?\s*\}/g;