Discord.js V13使用正则提取用户ID发送DM时报404错误如何解决?
错误原因
USERS_PATTERN自带全局匹配g标志,直接调用String.match()只会返回所有完整匹配结果的数组,不会返回捕获组内的用户ID,导致你拿到的id为undefined,client.users.fetch(undefined)自然会请求不存在的接口返回404- 直接将
args数组强转为字符串的逻辑不可靠,当命令后有多个参数时会自动插入逗号,可能导致正则匹配失效 - 没有添加错误捕获逻辑,就算ID正确,目标用户关闭了陌生人DM、或者机器人被用户拉黑也会抛出未捕获的异常
修复后代码(推荐方案,无需手动正则匹配)
const { MessageMentions: { USERS_PATTERN } } = require('discord.js'); const Discord = require("discord.js"); const Command = require("../Structures/Command.js"); module.exports = new Command({ name: "DM", description: "Will DM given author", async run(message, args, client) { // 直接从消息的提及集合里取第一个被@的用户,无需手动正则解析 const targetUser = message.mentions.users.first(); if (!targetUser) return message.reply("请@你要发送DM的用户"); try { await targetUser.send("Hello"); message.reply("DM已发送成功"); } catch (err) { // 捕获所有异常场景,避免程序崩溃 message.reply("无法向该用户发送DM,可能是用户关闭了陌生人私信或已拉黑机器人"); console.error("发送DM失败:", err); } } })
需坚持使用正则匹配的修复方案
const { MessageMentions: { USERS_PATTERN } } = require('discord.js'); const Discord = require("discord.js"); const Command = require("../Structures/Command.js"); module.exports = new Command({ name: "DM", description: "Will DM given author", async run(message, args, client) { // 取第一个参数做匹配,不要转换整个args数组 const match = USERS_PATTERN.exec(args[0]); if (!match) return message.reply("请@你要发送DM的用户"); const id = match[1]; try { const targetUser = await client.users.fetch(id); await targetUser.send("Hello"); message.reply("DM已发送成功"); } catch (err) { message.reply("无法向该用户发送DM,可能是用户ID无效、用户关闭了陌生人私信或已拉黑机器人"); console.error("操作失败:", err); } } })
内容的提问来源于stack exchange,提问作者Ayush Yadav
相关产品推荐
相关产品推荐

