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

如何在discord.js中先插入含待创建消息ID的数据到MongoDB?

解决Discord消息ID预存MongoDB的问题

核心矛盾

Discord的消息ID是平台在消息发送成功后才生成的,未发送的消息根本没有官方分配的ID——你原来想「先拿消息ID存库,再发消息」的流程逻辑上走不通,这就是第一种方案ID为空的原因。

可行的调整方案

换个思路,用本地临时标识过渡,既满足「仅数据库插入成功才显示消息」的需求,又能最终把真实消息ID存入数据库:

  1. 用户触发命令后,先准备好要发送的消息内容
  2. 生成一个本地唯一临时ID(比如UUID)
  3. 把临时ID+消息内容插入MongoDB
  4. 确认数据库插入成功后,再发送消息到Discord,获取返回的真实消息ID
  5. 用真实消息ID更新MongoDB里对应的文档,替换掉临时ID

代码示例(Discord.js + Mongoose)

const { v4: uuidv4 } = require('uuid');
const MessageRecord = require('./models/MessageRecord'); // 你的Mongoose数据模型

client.on('interactionCreate', async (interaction) => {
  if (!interaction.isChatInputCommand()) return;

  if (interaction.commandName === 'send-message') {
    // 1. 准备消息内容
    const messageContent = '你要发送的消息内容';
    
    // 2. 生成本地临时唯一ID
    const tempId = uuidv4();

    try {
      // 3. 先插入数据库
      const newRecord = await MessageRecord.create({
        tempId,
        content: messageContent,
        discordMessageId: null // 先留空,后续更新
      });

      // 4. 插入成功后发送消息
      const sentMessage = await interaction.channel.send(messageContent);

      // 5. 更新数据库里的真实消息ID
      await MessageRecord.findByIdAndUpdate(newRecord._id, {
        discordMessageId: sentMessage.id,
        tempId: null // 不需要的话可以删掉这个字段
      });

      await interaction.reply('消息已发送并完成记录');
    } catch (error) {
      console.error('操作出错:', error);
      await interaction.reply('发送失败,请稍后重试');
    }
  }
});

方案优势

  • 完美避开「先发消息再存库」的风险:只有数据库插入成功才会发送消息,符合你的需求
  • 最终能把Discord的真实消息ID存入数据库,解决第一种方案ID为空的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 16:42:50