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

Discord.js中如何在userUpdate事件获取guild id用于MongoDB查询

问题解答

userUpdate 是Discord的全局用户更新事件,触发时仅返回新旧两个用户对象,本身不绑定任何服务器,无法直接从事件参数中获取 guild id。
你当前代码里引用的 message.guild.id 会直接报错,因为该事件回调参数中不存在 message 对象。

如果你需要在所有配置了日志功能的服务器推送该用户的标签更新通知,可以遍历客户端已加入的所有服务器,逐个匹配MongoDB中的日志配置再执行操作,参考实现如下:

// 把schema加载放到事件外,避免重复加载损耗性能
const LogsSchema = require('./structures/LogsChannel')

client.on('userUpdate', async (oldUser, newUser) => {
  // 只在用户标签变更时执行后续逻辑,减少不必要的查询
  if (oldUser.discriminator === newUser.discriminator) return

  // 遍历客户端已加入的所有服务器
  for (const guild of client.guilds.cache.values()) {
    // 可选优化:先判断该用户是否在当前服务器内,不存在就跳过查询
    if (!guild.members.cache.has(newUser.id)) continue

    // 查询当前服务器的日志配置
    const logsdata = await LogsSchema.findOne({ guildId: guild.id }).catch(err => console.error(err))
    if (!logsdata?.logschannelId) continue

    const logChannel = client.channels.cache.get(logsdata.logschannelId)
    // 校验频道存在、客户端有发消息和嵌入链接权限
    if (!logChannel?.permissionsFor(client.user)?.has(['SendMessages', 'EmbedLinks'])) continue

    // 发送日志
    logChannel.send({
      embeds: [
        client.functions.embed()
          .setTitle(`> 【资料更新】`)
          .setThumbnail(newUser.displayAvatarURL())
          .setDescription(` <@${newUser.id}> 更改了自己的用户标签!`)
          .addFields(
            { name: '旧标签:', value: `\`#${oldUser.discriminator}\``, inline: true },
            { name: '新标签:', value: `\`#${newUser.discriminator}\``, inline: true },
          )
          .setTimestamp()
          .setFooter(`用户ID ${newUser.id}`)
      ]
    })
  }
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:36:06