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

基于quick.db的Discord通知功能仅单用户收推送如何修复

问题根因

你当前的代码存在两个核心错误,导致只能向单个用户发送通知:

  • 你从quick.db取出的notifiedusers_${message.author.id}存储的是单个用户ID,而非所有订阅用户的ID数组,且代码没有对订阅用户列表做遍历操作,仅调用了一次client.users.cache.get()获取单个用户发送消息
  • 你使用的try-finally逻辑存在缺陷,就算发送失败也会提示「所有人都已通知」,完全没有错误捕获和批量处理的逻辑
修复步骤

1. 调整订阅用户存储逻辑

首先需要修改用户订阅通知的逻辑,将新的订阅用户ID追加到数组中存储,而非直接覆盖存储单条ID,正确的存储逻辑示例如下:

// 订阅功能逻辑示例
const targetUserId = 申请订阅的用户ID;
// 取出已有的订阅用户列表,默认是空数组
let notifyUserList = db.get(`notifiedusers_${message.author.id}`) || [];
// 避免重复存储同一用户
if(!notifyUserList.includes(targetUserId)) {
  // 追加新用户到列表
  notifyUserList.push(targetUserId);
  // 存回数据库
  db.set(`notifiedusers_${message.author.id}`, notifyUserList);
}

你也可以直接使用quick.db内置的push方法简化操作:

db.push(`notifiedusers_${message.author.id}`, 申请订阅的用户ID)

2. 替换notify.js的发送逻辑

将原代码中发送通知的逻辑替换为批量遍历发送的版本,修复后的完整代码如下:

module.exports = {
  name: 'notify',
  description: '发布新版本时通知所有订阅用户',
  category: "通知",
  async execute(client, message, args, Discord) {
    if(message.member.user.id === '601364286731714591'){
      const db = require('quick.db')
      // 取出所有订阅用户的ID数组
      let notifyUserList = db.get(`notifiedusers_${message.author.id}`);
      if(notifyUserList === null || !notifyUserList.length) {
        return message.channel.send('当前没有用户订阅更新通知')
      }
      const content = args.join(" ")
      if(!content) return message.channel.send('请输入更新通知的内容')
      
      const newEmbed = new Discord.MessageEmbed()
        .setColor('#b5b5b5')
        .setTitle('更新通知')
        .setDescription(`${content}`)
      message.channel.send('正在向所有订阅用户发送通知')
      
      let failCount = 0;
      // 遍历所有订阅用户逐一发送
      for(const userId of notifyUserList) {
        try {
          const targetUser = await client.users.fetch(userId);
          if(targetUser) await targetUser.send({embeds: [newEmbed]});
          else failCount++;
        } catch(e) {
          failCount++;
          // 此处可自行添加错误日志打印逻辑
        }
      }

      message.channel.send(`通知发送完毕,成功发送${notifyUserList.length - failCount}人,失败${failCount}人`);
    }else{
      return
    }
  }
}
quick.db常用操作说明
  • db.get(键名):获取指定键名存储的值,支持返回字符串、数字、数组、对象等所有JS基础类型
  • db.set(键名, 存储值):给指定键名设置存储值,会覆盖原有内容
  • db.push(键名, 追加元素):如果指定键名存储的是数组,可以直接调用该方法追加元素,不需要手动取值修改后再存回
  • db.delete(键名):删除指定键名的存储内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 23:09:01