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

Discord.js中嵌套readFile的自定义函数返回undefined问题求助

问题分析与修复方案

问题根源

你遇到的undefined问题,核心原因是**fs.readFile是异步函数**:

  • 你的GetDate函数本身没有返回值,回调函数里的return只是结束回调逻辑,不会把结果传递给GetDate的调用者。
  • 之前直接把readFile放在messageCreate里能用,是因为所有依赖结果的逻辑都在回调函数内执行;封装成函数后,你试图同步获取异步操作的结果,自然拿不到值。

另外原代码还有两个小问题:

  • 循环变量i未声明,会成为全局变量,建议改为let i=0
  • 遍历整个数组的逻辑可以优化,找到匹配项后无需继续遍历

修复方案

方案一:用Promise+async/await处理异步(推荐)

把GetDate封装成Promise,调用时用await等待结果:

修改GetDate函数:

function GetDate(userid) {
  return new Promise((resolve, reject) => {
    fs.readFile("users.json", "utf-8", (err, jsonString) => {
      if (err) {
        reject(err);
        return;
      }
      try {
        const obj = JSON.parse(jsonString);
        // 用find方法直接查找匹配的用户,更简洁高效
        const targetUser = obj.users.find(user => user.id === userid);
        // 找到则返回date,没找到返回空字符串(可根据需求调整)
        resolve(targetUser ? targetUser.date : "");
      } catch (parseError) {
        reject(`解析JSON出错:${parseError}`);
      }
    });
  });
}

修改messageCreate事件监听器:

// 给事件处理函数加async关键字
client.on("messageCreate", async message => {
  if (message.content === "test") {
    try {
      const date = await GetDate(message.author.id);
      console.log(date);
    } catch (error) {
      // 捕获并处理错误
      console.error("获取日期失败:", error);
    }
  }
});

方案二:使用同步读取(适合小文件场景)

如果你的users.json文件很小,不会造成性能阻塞,可以用fs.readFileSync同步读取:

修改GetDate函数:

function GetDate(userid) {
  try {
    const jsonString = fs.readFileSync("users.json", "utf-8");
    const obj = JSON.parse(jsonString);
    const targetUser = obj.users.find(user => user.id === userid);
    return targetUser ? targetUser.date : "";
  } catch (error) {
    return `出错:${error.message}`;
  }
}

此时messageCreate里的调用逻辑不用改,直接就能拿到结果。


内容的提问来源于stack exchange,提问作者user874737

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 18:20:29