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

Discord.js斜杠命令发送含Ping延迟Embed报错排查

报错根因

两个报错对应代码里的三处逻辑问题:

  • interaction.reply() 默认不会返回已发送的消息对象,原代码.then((msg) => {})中拿到的msg实际为undefined,读取msg.createdTimestamp直接触发类型错误
  • 原代码中message.createdTimestamp引用的message变量从未定义,斜杠命令场景下,交互发起时间直接从入参interaction的createdTimestamp属性获取即可,不存在独立的message对象
  • 混用async/await和.then()链式写法导致执行时序错乱:await interaction.reply()执行完成后已经完成首次回复,.then()内的逻辑重复触发交互响应,就会抛出交互已回复的错误。
修复后可直接运行的代码
const { SlashCommandBuilder } = require('@discordjs/builders');
const { MessageEmbed } = require('discord.js');

module.exports = {
    data: new SlashCommandBuilder()
        .setName('ping')
        .setDescription('查看机器人响应延迟'),
    async execute(interaction) {
        // 发送过渡提示时开启fetchReply: true,才能拿到发送成功的消息对象
        const replyMsg = await interaction.reply({
            content: "正在计算延迟...",
            fetchReply: true
        });

        // 计算耗时:回复消息创建时间 - 交互发起时间
        const latency = replyMsg.createdTimestamp - interaction.createdTimestamp;

        const pingEmbed = new MessageEmbed()
            .setColor('#0000ff')
            .setTitle('Pong! :ping_pong:')
            .addField("响应耗时", `${latency}ms`)
            .addField("WebSocket延迟", `${interaction.client.ws.ping}ms`)
            .setThumbnail("https://78.media.tumblr.com/be43242341a7be9d50bb2ff8965abf61/tumblr_o1ximcnp1I1qf84u9o1_500.gif");
        
        // 编辑原回复,替换为embed内容,同时清空原过渡文字
        await interaction.editReply({
            content: "",
            embeds: [pingEmbed]
        });
    },
};
代码优化建议
  • 同一段异步逻辑里统一使用async/await写法,不要和.then()链式调用混用,避免时序问题,代码可读性也更高
  • 如果不需要显示"正在计算延迟"的过渡提示,可以直接计算延迟后一次性返回embed,省掉二次编辑的步骤,代码更简洁:
async execute(interaction) {
    const latency = Date.now() - interaction.createdTimestamp;
    const pingEmbed = new MessageEmbed()
        .setColor('#0000ff')
        .setTitle('Pong! :ping_pong:')
        .addField("响应耗时", `${latency}ms`)
        .addField("WebSocket延迟", `${interaction.client.ws.ping}ms`)
        .setThumbnail("https://78.media.tumblr.com/be43242341a7be9d50bb2ff8965abf61/tumblr_o1ximcnp1I1qf84u9o1_500.gif");
    
    await interaction.reply({ embeds: [pingEmbed] });
}
  • 颜色值推荐使用#RRGGBB格式的十六进制字符串,比0x前缀的数值写法可读性更高
  • 编辑已有交互回复时,记得把不需要保留的原字段(比如之前发的过渡文字content)显式设为空,否则旧内容会和新内容一起展示
  • 除了端到端的响应耗时,建议额外展示WebSocket连接延迟,也就是interaction.client.ws.ping,返回的延迟信息更全面

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 04:45:39