Discord机器人读取txt文件报ReferenceError:open未定义如何解决
Discord机器人读取本地txt文件报错
open is not defined解决 问题描述
尝试开发Discord机器人实现读取本地txt文件中存储的日期数据功能,查阅文档和同类帖子后仍持续触发相同报错。刚开始接触编程,若代码存在明显格式或逻辑问题请见谅。
原问题代码
list = open("dates.txt","r") list.seek(0) var firstLine = file1.readline() file1.close() bot.sendMessage({ to: channelID, message: firstLine })
触发的报错
C:\Users\My Laptop\Desktop\Discord Bots\HeadzUp\bot.js:241 list = open("dates.txt","r") ^ ReferenceError: open is not defined at DiscordClient.<anonymous> (C:\Users\My Laptop\Desktop\Discord Bots\HeadzUp\bot.js:241:13) at DiscordClient.emit (node:events:527:28) at DiscordClient.handleWSMessage (C:\Users\My Laptop\Desktop\Discord Bots\HeadzUp\node_modules\discord.io\lib\index.js:1854:11) at WebSocket.emit (node:events:527:28) at Receiver.ontext (C:\Users\My Laptop\Desktop\Discord Bots\HeadzUp\node_modules\ws\lib\WebSocket.js:841:10) at C:\Users\My Laptop\Desktop\Discord Bots\HeadzUp\node_modules\ws\lib\Receiver.js:536:18) at Receiver.applyExtensions (C:\Users\My Laptop\Desktop\Discord Bots\HeadzUp\node_modules\ws\lib\Receiver.js:371:5) at C:\Users\My Laptop\Desktop\Discord Bots\HeadzUp\node_modules\ws\lib\Receiver.js:508:14) at Receiver.flush (C:\Users\My Laptop\Desktop\Discord Bots\HeadzUp\node_modules\ws\lib\Receiver.js:347:3) at Receiver.finish (C:\Users\My Laptop\Desktop\Discord Bots\HeadzUp\node_modules\ws\lib\Receiver.js:541:12) PS C:\Users\My Laptop\Desktop\Discord Bots\HeadzUp>
已知运行信息
- 机器人其他功能(如指令响应)可正常运行
dates.txt存放在C:\Users\My Laptop\Desktop\Discord Bots\HeadzUp路径下,和bot代码文件同级
问题原因
你混淆了编程语言的语法:你运行的机器人是Node.js(JavaScript)环境的,但你写的open()打开文件、seek()跳指针、readline()读行、close()关文件这套是Python的文件操作写法,Node.js里没有全局定义的open函数,所以直接触发未定义错误。
另外你的代码还有变量名不匹配的问题:你把打开的文件对象赋值给了list变量,后续读行时却用了从未定义过的file1变量,就算open函数可用,这里也会触发新的报错。
修复方法
Node.js环境下读文件需要用内置的fs模块,直接替换对应代码即可:
- 在代码文件顶部引入需要的内置模块:
const fs = require('fs'); const path = require('path');
- 替换你原来写的读文件逻辑,用绝对路径匹配文件避免找不到文件的问题:
// 拼接dates.txt的绝对路径,不受脚本运行目录影响 const targetFilePath = path.join(__dirname, 'dates.txt'); // 同步读取文件内容,指定utf8编码直接拿到字符串格式的文本 const fileContent = fs.readFileSync(targetFilePath, 'utf8'); // 兼容Windows和类Unix系统的换行符,分割内容取第一行,trim()去掉首尾多余的空白和换行符 const firstLine = fileContent.split(/\r?\n/)[0].trim(); bot.sendMessage({ to: channelID, message: firstLine })
可选优化:可以给读文件逻辑加try/catch错误捕获,当文件不存在、权限不足时不会直接导致机器人进程崩溃。
内容的提问来源于stack exchange,提问作者TheGM
相关产品推荐
相关产品推荐

