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

Discord.js编写仅管理员可执行命令时报permissions.has错误如何解决

报错原因
  • message.author 是Discord全局用户对象,不包含单服务器内的权限属性,服务器成员的权限信息需要从message.member(发送者在当前服务器的成员实例)上获取,你调用了不存在的message.author.permissions属性,所以读取has方法时抛出undefined类型错误。
  • 权限判断逻辑写法错误:!Permissions.STAGE_MODERATOR是对权限常量做逻辑非运算,会直接转为布尔值,不属于合法的权限入参,正确写法是将权限常量传入has()方法后,再对整个判断结果取非。
修复方案

以下是修正后的完整代码,同时优化了原有逻辑的不合理之处:

// Discord.js v14版本已将Permissions重命名为PermissionsBitField,v13及以下版本可替换为原Permissions
const { PermissionsBitField } = require('discord.js');

//comando nick
if(comando === 'nick'){
    // 修正权限获取来源和判断逻辑,这里使用更贴合改昵称场景的ManageNicknames权限,你也可以替换回STAGE_MODERATOR
    if (!message.member.permissions.has(PermissionsBitField.Flags.ManageNicknames)) return message.reply('No Perms!');
    if(args.length === 0){
        message.channel.send(`请输入要设置的昵称`);
    } else {
        // 加入错误捕获逻辑,避免机器人权限不足时抛出未捕获异常
        message.guild.members.cache.get(client.user.id).setNickname(args.join(' '))
        .then(() => {
            message.channel.send(`已成功修改机器人昵称`);
        })
        .catch(() => {
            message.channel.send(`修改昵称失败,请检查机器人权限是否足够`);
        });
    }
}

额外优化说明

  • 原判断args == ''的逻辑不够严谨,args通常为命令拆分后的数组,使用args.length === 0判断空输入更准确,调用args.join(' ')拼接参数可支持设置带空格的昵称。
  • 新增设置失败捕获逻辑,可处理机器人角色等级不足、无修改昵称权限等异常场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:06:02