Discord.js v14欢迎消息失效,出现TypeError: replace不是函数错误
Discord.js v14 欢迎消息报错修复(TypeError: welcometxt.replace is not a function)
错误原因
你在已经获取到数据库数据data的情况下,重复调用了Welcome.findOne(),这个方法返回的是Mongoose Query对象而非字符串,因此无法调用replace()方法,直接触发类型错误。
修正后的代码
const { MessageAttachment } = require("discord.js"); const Welcome = require('../../settings/models/guild'); module.exports = async (client, member) => { const { guild } = member; // 改用async/await避免回调嵌套,更易维护 const data = await Welcome.findOne({ guildID: guild.id }); if (!data) return; const user = member.user; const channel = guild.channels.cache.get(data.welcomeChannel); if (!channel) return; // 新增频道存在性判断,避免无效操作 // 直接使用数据库中存储的欢迎文本字段(请根据你的Schema字段名调整,示例为welcomeMessage) let welcometxt = data.welcomeMessage; // 替换模板变量 welcometxt = welcometxt.replace('{member:mention}', `<@${user.id}>`); welcometxt = welcometxt.replace('{member:name}', user.username); welcometxt = welcometxt.replace('{member:id}', user.id); welcometxt = welcometxt.replace('{member:tag}', user.tag); welcometxt = welcometxt.replace('{member:createdAt}', user.createdAt.toLocaleString()); // 优化日期显示格式 welcometxt = welcometxt.replace('{server:name}', guild.name); welcometxt = welcometxt.replace('{server:members}', guild.memberCount); // 使用官方成员统计接口,比缓存更准确 await channel.send(welcometxt); };
关键注意事项
- 数据库字段匹配:确保你的
guildSchema中存在存储欢迎文本的字段(示例用welcomeMessage),字段名需与代码对应 - Intent配置:Discord.js v14必须开启对应意图才能触发
guildMemberAdd事件,客户端初始化代码需添加:const { Client, GatewayIntentBits } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers ] }); - 边界处理:新增频道存在性判断,避免因配置错误导致额外报错
- 数据准确性:替换缓存成员数为官方
guild.memberCount,优化日期显示格式提升用户体验
内容的提问来源于stack exchange,提问作者MihaiT
相关产品推荐
相关产品推荐

