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

如何在Discord消息触发时向Express服务器推送消息?现有代码仅生效一次

问题分析与解决方案

你的代码核心问题是每次收到Discord消息时都重复注册根路径的GET路由,这会导致后续的消息覆盖之前的路由处理逻辑,最终只有最后一条消息能被网站获取到,而且这种写法完全不符合Express的路由规范。


修正方案:用变量存储最新消息

我们需要一个全局变量来存储最新的Discord消息内容,让Express路由直接返回这个变量的值,而不是重复注册路由。

基础版代码(仅显示最新消息)

const { Client } = require("discord.js");
const express = require("express");

const client = new Client({ 
  intents: ["GUILDS", "GUILD_MEMBERS", "GUILD_MESSAGES", "GUILD_PRESENCES"] 
});
const app = express();

// 存储最新的Discord消息内容
let latestMessage = "暂无新消息";

// 仅注册一次Express路由
app.get("/", (req, res) => {
  res.send(latestMessage);
});

// Discord消息监听事件(注意:discord.js v14+ 已将原"message"事件改为"messageCreate")
client.on("messageCreate", (message) => {
  // 可选:忽略机器人自身发送的消息
  if (message.author.bot) return;
  // 更新最新消息变量
  latestMessage = message.content;
  console.log("已更新最新消息:", latestMessage);
});

client.on("ready", () => {
  console.log(`机器人已登录:${client.user.tag}`);
});

// 启动服务
client.login("你的Discord机器人令牌");
app.listen(3000, () => {
  console.log("Express服务器运行在 http://localhost:3000");
});

进阶版代码(显示消息历史)

如果需要展示多条消息而非仅最新一条,可以用数组存储消息历史,并在网站上用HTML列表渲染:

const { Client } = require("discord.js");
const express = require("express");

const client = new Client({ 
  intents: ["GUILDS", "GUILD_MEMBERS", "GUILD_MESSAGES", "GUILD_PRESENCES"] 
});
const app = express();

// 存储消息历史,限制最多50条
let messageHistory = [];
const MAX_HISTORY_COUNT = 50;

app.get("/", (req, res) => {
  // 用HTML渲染消息列表
  let htmlContent = "<h1>Discord消息同步</h1><ul>";
  messageHistory.forEach(msg => {
    htmlContent += `<li><strong>${msg.sender}</strong> [${msg.time}]: ${msg.content}</li>`;
  });
  htmlContent += "</ul>";
  res.send(htmlContent);
});

client.on("messageCreate", (message) => {
  if (message.author.bot) return;
  // 加入新消息,包含发送者、时间和内容
  messageHistory.push({
    sender: message.author.tag,
    content: message.content,
    time: new Date().toLocaleString()
  });
  // 超出数量限制时删除最早的消息
  if (messageHistory.length > MAX_HISTORY_COUNT) {
    messageHistory.shift();
  }
});

client.on("ready", () => {
  console.log(`机器人已登录:${client.user.tag}`);
});

client.login("你的Discord机器人令牌");
app.listen(3000, () => {
  console.log("Express服务器运行在 http://localhost:3000");
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:18:31