Node.js中fs.readFile触发ERR_INVALID_ARG_TYPE错误求助
Node.js 文件读写异步操作错误修复
错误原因分析
你代码里的报错核心是异步版fs.readFile参数传递错误:
- 异步
fs.readFile的正确参数格式为:fs.readFile(文件路径, 编码格式, 回调函数) - 你最后一行调用
fs.readFile("datafile.txt", "utf-8")时,仅传了两个参数,Node.js会把第二个参数utf-8当作回调函数处理,但它是字符串类型,不符合要求,因此抛出ERR_INVALID_ARG_TYPE错误。 - 另外,就算参数传对,直接
console.log(fs.readFile(...))也只会打印Promise对象(Node.js v10+异步fs方法返回Promise),无法拿到实际文件内容。
解决方案
方案1:保持回调风格,补全正确参数
修改writeFile成功后的readFile调用,传入完整的回调函数处理读取结果:
const fs = require('fs'); fs.readFile("datafile.txt", "utf-8", function(err, data){ let newData = "Some string to write in file"; fs.writeFile("datafile.txt", newData, (err) => { if (err) { console.log(err); } else { console.log("File written successfully\n"); // 补全回调函数,正确读取并打印文件内容 fs.readFile("datafile.txt", "utf-8", (readErr, content) => { if (readErr) { console.log(readErr); } else { console.log("文件内容:", content); } }); } }); })
方案2:使用Promise/async-await风格(推荐,避免回调地狱)
Node.js v10+支持fs.promisesAPI,用async/await可以让异步代码更简洁易读:
const fs = require('fs').promises; async function updateAndVerifyFile() { try { // 读取原文件(若不需要原内容可跳过此步) const originalData = await fs.readFile("datafile.txt", "utf-8"); const newData = "Some string to write in file"; // 写入新内容 await fs.writeFile("datafile.txt", newData); console.log("File written successfully\n"); // 重新读取验证内容 const updatedContent = await fs.readFile("datafile.txt", "utf-8"); console.log("文件内容:", updatedContent); } catch (err) { console.error("操作出错:", err); } } updateAndVerifyFile();
补充说明
- 若仅需验证写入是否成功,
fs.writeFile的回调触发且无错误时,就已经代表写入完成,无需额外读取;若要确认内容正确性,读取验证是合理操作。 - 异步操作的核心逻辑是:必须等待前一个异步任务完成后,再执行依赖它的后续操作,回调、Promise、async-await都是实现该逻辑的不同方式。
内容的提问来源于stack exchange,提问作者Ankur Rangi
相关产品推荐
相关产品推荐

