如何用Node.js+MongoDB调用Stellar Horizon查询账户余额
Stellar账户余额查询(MongoDB版实现)
核心实现思路
从MongoDB中读取用户的publicKey,调用Stellar Horizon节点的loadAccount方法获取账户余额,同时处理可能的异常(比如账户未激活)。
单个用户余额查询接口
const stellar = require('stellar-sdk'); const userModel = require('../models/user.model'); // 初始化Horizon测试网节点 const server = new stellar.Server("https://horizon-testnet.stellar.org"); // 根据用户ID查询余额(可根据业务调整为邮箱等标识) module.exports.getAccountBalance = async (req, res) => { try { const { userId } = req.params; // 从MongoDB读取用户的publicKey const user = await userModel.findById(userId); if (!user) { return res.status(404).json({ error: "用户不存在" }); } // 调用Horizon接口加载账户信息 const account = await server.loadAccount(user.publicKey); // 格式化返回的余额数据 const balanceData = { publicKey: account.id, balances: account.balances.map(balance => ({ asset: balance.asset_code || "XLM", issuer: balance.asset_issuer || null, balance: balance.balance, availableLimit: balance.limit || null })) }; res.status(200).json(balanceData); } catch (err) { // 处理账户未激活的常见错误 if (err instanceof stellar.NotFoundError) { return res.status(400).json({ error: "该Stellar账户未激活,请先转入至少1XLM" }); } res.status(500).json({ error: err.message }); } };
批量查询所有用户余额
如果需要批量统计所有用户的账户状态,可使用以下代码:
const stellar = require('stellar-sdk'); const userModel = require('../models/user.model'); const server = new stellar.Server("https://horizon-testnet.stellar.org"); module.exports.getAllAccountsBalance = async (req, res) => { try { // 仅查询用户的publicKey和昵称,减少数据传输 const users = await userModel.find({}, "publicKey pseudo"); // 批量处理异步请求,单个账户查询失败不影响整体 const accountList = await Promise.all( users.map(async (user) => { try { const account = await server.loadAccount(user.publicKey); return { userName: user.pseudo, publicKey: account.id, balances: account.balances }; } catch (subErr) { return { userName: user.pseudo, publicKey: user.publicKey, status: subErr instanceof stellar.NotFoundError ? "账户未激活" : "查询失败", errorMsg: subErr.message }; } }) ); res.status(200).json(accountList); } catch (err) { res.status(500).json({ error: err.message }); } };
关键注意事项
- 账户激活要求:Stellar账户必须转入至少1XLM才能完成激活,否则
loadAccount会抛出NotFoundError,需单独捕获处理。 - 查询效率优化:MongoDB查询时只返回
publicKey等必要字段,避免冗余数据传输。 - 环境适配:如果切换到主网,将Horizon地址改为
https://horizon.stellar.org即可。
内容的提问来源于stack exchange,提问作者Sophia
相关产品推荐
相关产品推荐

