为什么fs.writeFile运行无报错但数据未写入目标文件?
问题原因分析
- 核心原因是异步API执行时序问题:
fs.writeFile是 Node.js 内置的回调式异步IO接口,调用后不会阻塞主线程执行,会先将文件写入任务提交到事件循环队列,主线程继续执行后续代码。你的业务代码在调用fs.writeFile后立刻执行了process.exit(1)直接终止进程,此时文件写入操作还未执行完成,回调函数也没有被触发,自然不会有数据写入目标文件。单独测试时没有加进程退出逻辑,Node.js 会等待所有异步IO任务执行完成后才自动退出进程,所以写入可以正常生效。 - 次要问题是代码存在语法错误:你贴出的业务函数代码结构不合法,async 自执行函数体内没有声明
try块就直接写了catch分支,运行时会直接抛出语法错误,也会影响正常逻辑执行。
修复方案
你可以选择以下任意一种方案修复:
- 将进程退出逻辑放到
fs.writeFile的回调中,确保写入完成后再退出进程:
const fs = require("fs"); (async () => { try { const test = [ 'test1', 'test2' ] fs.writeFile('file.txt', test, {flag: "a"}, err => { if (err) throw err // 写入完成后再退出 process.exit(1); }) } catch (e) { console.log('error: ', e) process.exit(1) } })()
- 使用 promise 版本的
fs.writeFile搭配await等待写入完成后再执行后续逻辑:
const fs = require("fs/promises"); // 引入promise版本的fs模块 (async () => { try { const test = [ 'test1', 'test2' ] await fs.writeFile('file.txt', test, {flag: "a"}) process.exit(1); } catch (e) { console.log('error: ', e) process.exit(1) } })()
- 直接改用同步写入接口
fs.writeFileSync,不需要处理异步等待逻辑:
const fs = require("fs"); (async () => { try { const test = [ 'test1', 'test2' ] fs.writeFileSync('file.txt', test, {flag: "a"}) process.exit(1); } catch (e) { console.log('error: ', e) process.exit(1) } })()
内容的提问来源于stack exchange,提问作者dokichan
相关产品推荐
相关产品推荐

