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

discord.js v14如何仅回复私信(DM)消息?

解决Discord机器人仅回复私信的问题

问题分析

你的代码无法正确识别私信的原因主要有两点:

  • 启用Partials后,收到的DM频道可能是PartialChannel对象,直接访问type属性会不准确
  • Discord.js v14+版本中,频道类型推荐使用ChannelType枚举而非字符串'DM',字符串判断可能失效

解决方案

1. 精简Intents配置

既然只需要处理私信,可以移除不需要的服务器相关权限,减少资源占用:

const { Client, IntentsBitField, Partials, ChannelType } = require('discord.js');

const client = new Client({
  intents: [
    IntentsBitField.Flags.DirectMessages,  // 仅保留私信相关权限
    IntentsBitField.Flags.MessageContent   // 读取消息内容权限
  ],
  partials: [
    Partials.Channel,
    Partials.Message
  ]
});

2. 修正私信判断逻辑

处理PartialChannel对象,并使用正确的频道类型枚举进行判断:

client.on('messageCreate', async (message) => {
  // 忽略机器人自身消息,避免循环回复
  if (message.author.bot) return;

  // 如果频道是Partial对象,先获取完整数据
  let channel = message.channel;
  if (channel.partial) {
    channel = await channel.fetch();
  }

  // 判断是否为私信频道
  if (channel.type === ChannelType.DM) {
    await message.author.send('Message Received');
  }
});

关键说明

  • Partial对象处理:启用Partials后,部分数据可能不完整,必须通过fetch()获取完整的频道对象才能正确判断类型
  • ChannelType枚举:Discord.js v14+已使用枚举类型替代字符串,确保类型判断的准确性
  • 忽略机器人消息:避免机器人回复自己发送的消息,防止无限循环

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 09:27:14