如何使用discord.js向Roblox发送POST请求完成Discord机器人对接
正确实现方案
原有代码核心问题
- 路由重复注册:每次触发命令就新增一次
app.post('/post')监听,会导致逻辑冲突、内存泄漏 - 服务启停逻辑错误:不需要每次触发命令就启停HTTP服务,频繁启停会导致端口占用、请求丢失
- 需求理解偏差:你要实现的是Discord向Roblox发POST请求,原有代码是搭建本地服务等待Roblox请求,逻辑方向完全相反
两种适用场景实现
根据你的实际需求选择对应方案即可:
场景1:Roblox主动拉取Discord侧消息
如果需要Roblox定期来拉取最新消息,保留HTTP服务,改为常驻启动即可:
初始化代码(放在Discord机器人启动逻辑中)
const express = require('express'); const app = express(); const port = 8000; // 存储最新同步到Roblox的消息 let latestRobloxMsg = ''; // 全局解析POST请求体 app.use(express.json()); // 常驻路由,Roblox请求该接口获取最新消息 app.post('/post', (req, res) => { console.log('收到Roblox侧请求,请求体:', req.body); res.send(latestRobloxMsg); }); // 机器人启动完成后一次性启动HTTP服务 client.on('ready', () => { app.listen(port, () => { console.log(`HTTP服务已启动,监听端口:${port}`); }); console.log('Discord机器人上线成功'); });
命令处理代码
if (command == "robloxmessage") { if (args[0] && args.length <= 1) { // 直接更新存储的消息即可,无需修改服务逻辑 latestRobloxMsg = args[0]; return message.channel.send(`已更新同步到Roblox的消息:${args[0]}`); } return message.channel.send(`请提供正确的参数,使用!help查看用法`); }
场景2:Discord主动向Roblox推送消息(符合你描述的需求)
不需要自己搭建HTTP服务,直接调用Roblox侧的公开接口发POST请求即可:
首先安装依赖:npm i axios
完整命令处理代码
const axios = require('axios'); if (command == "robloxmessage") { if (args[0] && args.length <= 1) { (async () => { try { // 替换为你Roblox侧的公开接口地址 const robloxRes = await axios.post('https://你的Roblox接口地址', { content: args[0] }, { headers: { 'Content-Type': 'application/json', // 如有Roblox接口鉴权要求,在此处补充请求头,比如API密钥 // 'Roblox-API-Key': '你的密钥内容' } }); console.log('推送到Roblox成功,返回内容:', robloxRes.data); return message.channel.send(`已成功推送消息到Roblox:${args[0]}`); } catch (err) { console.error('推送到Roblox失败:', err); return message.reply('发送失败,请稍后重试或联系管理员'); } })(); } return message.channel.send(`请提供正确的参数,使用!help查看用法`); }
注意事项
- 场景1使用时需要将本地8000端口暴露到公网,Roblox才能正常访问
- 场景2使用时需要提前在Roblox侧部署好接收POST请求的公开接口,配置好跨域和鉴权规则
内容的提问来源于stack exchange,提问作者user14345605
相关产品推荐
相关产品推荐

