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

