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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 19:15:32