Node.js中Firebase反向查询:已知Roblox ID获取Discord ID
问题说明
我用Node.js开发Roblox游戏验证机器人时遇到Firebase相关问题:Firebase存储结构为/verified/{DiscordID},其中linked字段对应Roblox用户ID。现有脚本可通过Discord ID查询匹配的Roblox ID,但现在需要反向通过已知的Roblox ID获取对应的Discord ID,求实现方法或代码。
现有正向查询的未完成脚本如下:
app.get("/api/verify/:target/:rbxid", function(req, res) { async function update(target, rbxid) { var { body } = await snekfetch.get(`${config.firebaseURL}verified/${target}.json`) //console.log(body) //console.log(`${config.firebaseURL}/verified/${target}.json`) if (!body) { return res.json({"verify": false}) } var { body } = await snekfetch.get(`https://users.roblox.com/v1/users/${body.linked}`) if (body.id == rbxid) { return res.json({"verify": true}) } else { return res.json({"verify": false}) } } update(req.params.target,req.params.rbxid) })
解决方案
你的Firebase节点以Discord ID作为键,因此需要通过查询linked字段等于目标Roblox ID的方式反向匹配对应的Discord ID。以下是基于你现有snekfetch工具的实现方案:
反向查询接口实现代码
app.get("/api/get-discord/:rbxid", async function(req, res) { const targetRbxId = req.params.rbxid; try { // 构造Firebase查询:筛选linked字段与目标Roblox ID匹配的节点 const { body } = await snekfetch.get(`${config.firebaseURL}verified.json?orderBy="linked"&equalTo="${targetRbxId}"`); // 查询结果为空,说明无匹配项 if (Object.keys(body).length === 0) { return res.json({ "discordId": null, "found": false }); } // 取第一个匹配的Discord ID(假设一个Roblox ID仅绑定一个Discord账号) const discordId = Object.keys(body)[0]; return res.json({ "discordId": discordId, "found": true }); } catch (error) { console.error("查询出错:", error); return res.json({ "error": "查询失败", "found": false }); } })
关键注意事项
- Firebase数据库规则配置:必须确保数据库规则允许对
/verified节点的linked字段进行排序查询,同时添加索引提升性能,示例规则如下:
{ "rules": { "verified": { ".read": true, // 根据你的实际权限需求调整 ".write": false, ".indexOn": ["linked"] // 必须添加该索引,否则查询会报错或性能极低 } } }
- 多匹配场景处理:如果存在一个Roblox ID绑定多个Discord账号的情况,可以遍历
Object.keys(body)获取所有匹配的Discord ID。 - 错误捕获:通过
try/catch捕获网络请求或Firebase返回的异常,避免接口崩溃。
内容的提问来源于stack exchange,提问作者PlurrYT
相关产品推荐
相关产品推荐

