Discord.js v12用户对象属性缺失咨询:为何缺少dmChannel等属性?
为什么discord.js v12中fetch到的User对象缺少dmChannel等属性?
这个问题我升级discord.js v12的时候也踩过坑,核心原因是v12对users.fetch()的参数做了改动,再加上dmChannel本身就不是User对象默认返回的属性,咱们掰开了说:
1. users.fetch()的参数变化
在discord.js v11里,users.fetch(id, false)的第二个布尔值是用来控制是否跳过缓存直接请求API的,但到了v12,这个参数被改成了选项配置对象,不再接受布尔值。你现在传的false会被当作不符合规范的选项,导致客户端只拉取了最基础的用户信息,没获取关联的额外数据。
正确的用法应该传选项对象,比如:
// 强制从API拉取最新数据,忽略本地缓存 dc.users.fetch(id, { force: true }) .then(user => console.log(user));
如果不需要强制刷新缓存,直接调用dc.users.fetch(id)就行,默认会优先用缓存,缓存不存在时自动请求API。
2. dmChannel不会自动出现在User对象里
dmChannel属于和用户关联的频道资源,并不是用户本身的数据字段——哪怕你用正确的fetch方式,User对象里也不会默认包含这个属性。想要获取用户的DM频道,得调用User对象的createDM()方法:这个方法会自动检查是否已有DM频道,存在就直接返回,不存在则创建一个新的:
dc.users.fetch(id) .then(user => { console.log("基础用户信息:", user); return user.createDM(); }) .then(dmChannel => { console.log("DM频道信息:", dmChannel); // 这里就可以通过dmChannel发送消息等操作了 }) .catch(error => { console.error("获取DM频道失败:", error); });
另外要注意,如果机器人和用户还没产生过DM交互,调用createDM()会触发API创建频道的请求,这时候才会生成对应的dmChannel对象。
内容的提问来源于stack exchange,提问作者MrGeorgen
相关产品推荐
相关产品推荐

