Discord Bot跨文件传递变量返回[object Object]问题求助
解决方案
问题根源
- 你错误地将
module.exports写在了arrayproccesor函数内部,Node.js的模块导出是模块加载时就执行的静态操作,写在函数内部不会生效,你拿到的导出值默认是一个空对象,这就是出现[object Object]的直接原因。 - 你尝试通过
require('./bot-logic')获取运行时cmd变量的逻辑是错误的:require操作只会在模块第一次加载时读取目标文件的静态导出内容,无法获取命令触发时动态生成的运行时变量。 - 命令触发是异步事件,你之前的写法在模块加载时就已经计算好了msg的值,不会在用户每次触发命令时重新计算数据。
修复方案
步骤1:改造数组处理模块
将数组处理逻辑封装为可接收参数的纯函数导出,假设文件名为arrayProcessor.js:
// arrayProcessor.js /** * 处理map数据返回格式化字符串 * @param {string} cmd 命令名,作为map的key * @param {Map} dataMap 存储数据的map对象 * @returns {string} 格式化后的账号信息 */ module.exports = function processArray(cmd, dataMap) { let msg = ""; // 提前做存在性判断,避免未定义key报错 if (!dataMap.has(cmd)) { return "暂无对应账号数据"; } for (let [x, y] of dataMap.get(cmd)) { msg += `${x}: ${y}\n`; } return msg; }
步骤2:独立存储数据Map(可选,如果你需要单独管理数据)
如果你的数据map需要跨文件复用,可以单独存为一个模块,假设文件名为data-map.js:
// data-map.js const dataMap = new Map(); // 在这里写入你的map赋值逻辑,示例: // dataMap.set('udft', [['user1', 'pass1'], ['user2', 'pass2']]) module.exports = { dataMap };
步骤3:改造命令逻辑模块
在命令逻辑文件中导入依赖,命令触发时动态调用处理函数获取格式化后的内容:
// bot-logic.js 顶部导入依赖 const processArray = require("./arrayProcessor.js"); const { dataMap } = require("./data-map.js"); // 如果map直接写在当前文件,不需要导入,直接在当前文件定义dataMap即可 command(client, "udft", (message) => { // 命令触发时实时调用处理函数,传入当前命令名和数据map const accountsMsg = processArray("udft", dataMap); const embed = new Discord.MessageEmbed() .setColor("#fabe07") .setImage(/* 你的图片资源地址 */) .setTimestamp() .setURL(/* 目标跳转地址 */) .addFields({ name: "ACCOUNTS:", value: accountsMsg, inline: true, }) .addFields({ name: "STORE:", value: "Undefeated \n \n **LINK:**\n", inline: true, }); message.channel.send(embed); });
方案说明
- 所有动态参数通过函数传参传递,避免了循环依赖和静态导出无法获取运行时变量的问题
- 每次用户触发命令时才会实时计算返回内容,数据永远是最新的
- 完全符合Node.js模块化开发规范,也满足你跨文件拆分逻辑的需求
内容的提问来源于stack exchange,提问作者t0ken97c
相关产品推荐
相关产品推荐

