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
相关产品推荐
相关产品推荐

