You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 11:20:29