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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 19:24:05