Node.js新手使用fs.appendFile报错ERR-INVALID-CALLBACK求解决
问题分析与解决
错误原因
你遇到的ERR-INVALID-CALLBACK错误,直接原因是最后一行的fs.appendFile调用完全不符合API要求:
fs.appendFile(回调式)必须传入至少三个参数:目标文件路径、要追加的数据、错误处理回调函数;- 你当前只传入了
logger.log('Hello World!')的返回值,参数数量、类型都不匹配,Node.js无法识别有效的回调函数,因此抛出错误。 - 另外
new Logger属于不规范写法,虽然JS允许省略构造函数括号,但建议补上new Logger(),避免潜在问题。
修正方案
根据你的需求(监听器触发时写入数据到文件),分两种场景给出修正代码:
场景1:在监听器中处理文件写入
主代码调整为:
const Logger = require('./logger_demo') const logger = new Logger() // 补上构造函数括号 const fs = require('fs') // 监听message事件,触发时写入数据 logger.on('message', data => { console.log('Called Listener: ', data) // 正确调用fs.appendFile:路径、数据、回调 fs.appendFile('./log_demo.txt', `${data}\n`, (err) => { if (err) console.error('写入失败:', err) else console.log('File has been appended!') }) }) // 调用log方法触发事件 logger.log('Hello World!')
场景2:在Logger类的log方法中处理写入
如果希望log方法本身负责写入文件,修改logger_demo.js:
const EventEmitter = require('events') const fs = require('fs') class Logger extends EventEmitter { log(message) { // 触发message事件 this.emit('message', message) // 正确调用fs.appendFile fs.appendFile('./log_demo.txt', `${message}\n`, (err) => { if (err) console.error('写入失败:', err) else console.log('File has been appended!') }) } } module.exports = Logger
此时主代码可简化为:
const Logger = require('./logger_demo') const logger = new Logger() logger.on('message', data => console.log('Called Listener: ', data)) logger.log('Hello World!')
关键说明
- 建议将日志文件后缀改为
.txt,避免和JS源码文件混淆; - 写入时追加换行符
\n,让每条日志单独一行,可读性更好; - 异步操作的错误处理尽量用
console.error捕获,避免直接throw err导致进程崩溃。
内容的提问来源于stack exchange,提问作者eggyolk
相关产品推荐
相关产品推荐

