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

discord.js v14中MongoDB欢迎消息占位符替换失败问题求助

解决discord.js v14欢迎消息占位符替换undefined问题

核心原因

你在guildMemberAdd事件中调用成员属性、获取服务器成员总数的方式错误,导致替换占位符时返回undefined。

解决方案步骤

1. 统一占位符规则

先和存储到MongoDB的消息约定好占位符格式,比如:

  • {memberTag}:成员完整标签(如@azz#5271)
  • {member}:可点击的成员提及(如<@用户ID>)
  • {memberCount}:当前服务器成员总数

2. 修正属性调用与替换逻辑

在guildMemberAdd.js中使用正确的discord.js v14属性,并通过string.replace()批量替换占位符:

const { GuildMember } = require('discord.js');
const Welcome = require('../models/Welcome'); // 对应你的数据模型

module.exports = {
    name: 'guildMemberAdd',
    async execute(member) {
        if (!(member instanceof GuildMember)) return;
        const guild = member.guild;

        // 从MongoDB读取当前服务器的欢迎配置
        const welcomeConfig = await Welcome.findOne({ guildId: guild.id });
        if (!welcomeConfig?.message) return;

        let finalMessage = welcomeConfig.message;
        // 替换所有占位符
        finalMessage = finalMessage
            // 替换成员标签
            .replace(/{memberTag}/g, member.user.tag)
            // 替换成员提及(点击可跳转至成员主页)
            .replace(/{member}/g, member.toString())
            // 替换成员总数(用缓存值,若需精确数可改用下方注释代码)
            .replace(/{memberCount}/g, guild.memberCount);
            // 精确成员数:.replace(/{memberCount}/g, (await guild.members.fetch()).size);

        // 发送到配置的欢迎频道
        const targetChannel = guild.channels.cache.get(welcomeConfig.channelId);
        targetChannel?.send(finalMessage);
    }
};

3. 关键注意点

  • 确保member对象有效:v14中guildMemberAdd事件的参数是完整的GuildMember实例,可直接调用member.user.tag、member.id等属性
  • 成员总数的两种获取方式:
    • guild.memberCount:缓存的成员数量,获取速度快但可能有延迟
    • (await guild.members.fetch()).size:拉取服务器所有成员后的精确数量,需要异步处理
  • 占位符匹配:MongoDB中存储的消息占位符必须和replace()中的字符串完全一致(比如不要把{memberTag}写成{{memberTag}})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 21:05:10