使用fs/promises结合await时程序无报错直接退出问题求助
问题分析与修复
核心问题:程序提前退出
你的代码中main().then(process.exit(0))存在致命错误:process.exit(0)会立即执行,而非等待main函数的Promise完成后再触发。这导致main刚启动,还没等await readdir执行完毕,程序就直接退出,因此看不到后续文件列表打印和重命名逻辑的执行。
修复步骤
1. 修正then的回调写法
将process.exit(0)包裹为函数,让它在Promise成功后再执行:
main() .then(() => process.exit(0)) .catch((e) => { console.error(e); process.exit(1); });
2. 新增路径有效性检查(可选但推荐)
虽然你确认目录存在,但添加存在性检查可以避免路径解析错误导致的静默失败:
import { readdir, rename, access, constants } from "fs/promises"; // 在main函数开头添加 await access(oldDir, constants.F_OK); await access(newDir, constants.F_OK);
若路径不存在,会抛出错误并进入catch块,便于排查问题。
3. 解决回调式readdir返回undefined的问题
使用回调式fs.readdir时,必须通过回调函数获取结果,不能直接读取返回值:
import { readdir } from "fs"; readdir(oldDir, (err, files) => { if (err) { console.error(err); return; } console.log(files); // 此处可正确获取文件列表,不会返回undefined });
之前返回undefined是因为错误地尝试直接读取回调式API的返回值,这类API的结果只能在回调函数内获取。
完整修复后的代码
import { readdir, rename, access, constants } from "fs/promises"; import * as path from "path"; const oldDir = path.join(process.cwd(), "../Old Backgrounds"); const newDir = process.cwd(); async function main() { console.log("Main function started..."); console.log(oldDir); console.log(newDir); // 检查目录是否存在 try { await access(oldDir, constants.F_OK); await access(newDir, constants.F_OK); } catch (err) { throw new Error(`目录不存在: ${err.message}`); } const oldFiles = await readdir(oldDir); const newFiles = await readdir(newDir); console.log(`要使用的文件名: ${oldFiles}`); console.log(`待重命名的文件: ${newFiles}`); // 避免索引越界,确保两个目录文件数量一致 if (oldFiles.length !== newFiles.length) { throw new Error("两个目录文件数量不匹配,无法一一对应重命名"); } for (let i = 0; i < oldFiles.length; i++) { const currentName = newFiles[i]; const newName = oldFiles[i]; const currentPath = path.join(newDir, currentName); const renamePath = path.join(newDir, newName); await rename(currentPath, renamePath); console.log(`已重命名: ${currentName} -> ${newName}`); } } main() .then(() => process.exit(0)) .catch((e) => { console.error(e); process.exit(1); });
内容的提问来源于stack exchange,提问作者Inconsequentia1
相关产品推荐
相关产品推荐

