使用discord.js与Replit Database实现消息发送间隔时长统计的问题求助
解决JavaScript中数据库操作返回Promise导致的时间间隔计算问题
核心问题在于JavaScript异步操作的处理逻辑和Python不同——你用到的db.set和db.get都是异步方法,会返回Promise对象而非直接返回时间戳值,这就是你看到[object Promise]和计算出NaN的根本原因。
在Python中你可能使用的是同步数据库API,所以能直接赋值、取值,但JavaScript里大部分数据库操作都是异步的,必须等待Promise完成才能拿到实际结果。下面是两种可行的解决方案:
方案1:使用async/await(推荐,代码更简洁易读)
把消息处理逻辑包裹在async函数中,用await等待异步操作完成:
async function handleMessage(Msg) { let end = new Date().getTime(); if(Msg == "test") { // 这里放置你处理test消息的逻辑 } // 等待set操作完成,确保时间戳已存入数据库 await db.set("start", new Date().getTime()); // 用await获取start的实际值,而非Promise对象 const start = await db.get("start"); console.log(start); // 输出正确的时间戳 // 现在可以正常计算时间间隔 const timeInterval = start - end; console.log("消息间隔:", timeInterval); }
方案2:使用.then()链式调用(适配不支持async/await的环境)
如果你的代码运行环境不支持async/await(比如旧版Node.js或浏览器),可以用Promise的then方法处理异步流程:
let end = new Date().getTime(); if(Msg == "test") { // 这里放置你处理test消息的逻辑 } // 先执行set操作,完成后再执行get操作 db.set("start", new Date().getTime()) .then(() => { // set操作完成后,获取start的值 return db.get("start"); }) .then(start => { console.log(start); // 输出正确的时间戳 const timeInterval = start - end; console.log("消息间隔:", timeInterval); }) .catch(error => { // 别忘了处理数据库操作可能出现的错误 console.error("数据库操作失败:", error); });
重要提示
- 永远不要直接使用
db.get("start")的返回值,它是一个Promise,必须通过await或.then()提取实际结果。 - 如果你的消息处理逻辑是在机器人的消息监听回调中,记得把回调函数声明为
async,这样就能在里面正常使用await了。
内容的提问来源于stack exchange,提问作者Doctor Vaitzman
相关产品推荐
相关产品推荐

