如何在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
相关产品推荐
相关产品推荐

