Node.js中fs.promises.writeFile未完成文件写入就提前resolve问题求助
问题根因
你对fs.promises.writeFile的理解是完全正确的,它返回的Promise确实会在文件写入完成后才会resolve,你遇到的现象完全是代码写法错误导致的误解,核心问题有3个:
.then()回调写法错误
你写的.then(console.log(File Saved))会在代码执行到这一行时立刻调用console.log打印内容,再把console.log的返回值(undefined)传给.then(),而非等到writeFile的Promise resolve后再执行打印,所以日志时机早于写入完成时机。readFileSync未指定编码fs.readFileSync如果不传第二个参数指定编码格式,默认返回的就是Buffer对象,你看到的<Buffer ...>输出和文件是否写入完成完全无关,只是没有做编码转换而已。- 无效的
await使用JSON.stringify、console.log都是同步方法,返回值不是Promise,加await没有任何实际作用,属于无效写法。同时混用await和.then()也容易引发逻辑顺序的理解偏差,建议统一使用async/await语法。
修正后的代码
async function saveSettings(server, settings) { // 同步方法不需要加await const newSettings = JSON.stringify(settings, null, `\t`); // 统一用await等待写入完成,不需要混用then await fsPromises.writeFile(path.join(__dirname, `${server}.json`), newSettings) // 写入完成后再打印日志 console.log(`File Saved`); // 读文件时指定utf8编码,拿到字符串内容 console.log(fs.readFileSync(path.join(__dirname, `${server}.json`), 'utf8')); console.log(`Settings Saved`); return; }
修正后运行即可得到你预期的输出结果,写入逻辑完全符合你的预期,没有提前resolve的问题。
内容的提问来源于stack exchange,提问作者Kay-95
相关产品推荐
相关产品推荐

