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

如何在Discord.js中正确使用quick.db存储的ID调用client.users.fetch?

解决Discord.js中使用quick.db存储的用户ID时出现"[object Promise]"不是Snowflake的错误

问题根源

quick.db的db.get()是异步函数,它返回的是一个Promise对象,而非直接返回存储的ID字符串。你直接将其赋值给userid1,当client.users.fetch()调用时,传入的是Promise对象而非实际的用户ID,因此触发了user_id: Value "[object Promise]" is not snowflake的错误。

解决方案

需要等待db.get()执行完成,获取到实际的ID字符串后再调用client.users.fetch(),有两种实现方式:

方式1:使用async/await(更简洁)

将cron任务的回调函数改为async函数,通过await等待异步操作完成:

const Discord = require("discord.js")
const cron = require('cron');
const path = require('path');
const { QuickDB } = require("quick.db");
const db = new QuickDB()

module.exports = client => {

  console.log(`${client.user.username} ist online`)
  client.user.setActivity('Online!', { type: 'PLAYING' });
  
  let scheduledMessage = new cron.CronJob('00 00 08 * * *', async () => {
    // 等待获取存储的用户ID
    const userid1 = await db.get("id1.string");
    
    // 可选:添加ID有效性校验,避免无效值报错
    if (!userid1 || !/^\d{17,19}$/.test(userid1)) {
      console.log("存储的用户ID无效或不存在");
      return;
    }

    client.users.fetch(userid1).then(user => {
      user.send('Test').catch(err => {
        let channel = client.channels.cache.get('998568073034465341')
        channel.send(`${user} blocked the bot`)
      })
    })
  })
  scheduledMessage.start()
}

方式2:使用Promise链式调用

通过.then()处理db.get()的返回结果:

const Discord = require("discord.js")
const cron = require('cron');
const path = require('path');
const { QuickDB } = require("quick.db");
const db = new QuickDB()

module.exports = client => {

  console.log(`${client.user.username} ist online`)
  client.user.setActivity('Online!', { type: 'PLAYING' });
  
  let scheduledMessage = new cron.CronJob('00 00 08 * * *', () => {
    db.get("id1.string").then(userid1 => {
      // 可选:添加ID有效性校验
      if (!userid1 || !/^\d{17,19}$/.test(userid1)) {
        console.log("存储的用户ID无效或不存在");
        return;
      }

      client.users.fetch(userid1).then(user => {
        user.send('Test').catch(err => {
          let channel = client.channels.cache.get('998568073034465341')
          channel.send(`${user} blocked the bot`)
        })
      })
    })
  })
  scheduledMessage.start()
}

补充说明

  • 所有异步操作必须等待其完成后才能获取到实际值,不能直接赋值使用
  • 新增的ID格式校验(/^\d{17,19}$/)可以提前过滤无效的Snowflake格式,避免后续fetch操作报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 11:24:24