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

TypeScript接口返回空JSON问题:代码错误排查及解决建议

问题分析:为什么调用accountList()返回空JSON?

我来帮你拆解这段代码里的核心问题,这是很常见的异步操作处理失误:

  • 异步回调的返回时机完全错误
    client.getAccounts是异步方法,它的回调函数要等账户请求完成后才会执行。但你的accountList函数在调用完client.getAccounts后,根本没等异步操作结束就试图返回account数组——这时候回调里的push操作还没执行,数组自然是空的。更关键的是,你写的return account是在回调函数内部的,不属于外层accountList函数的返回值,所以accountList()实际返回的是undefined,序列化后就是空JSON。

  • 全局变量account的隐患
    你把account声明为全局数组,每次调用accountList都会往里面追加数据。就算异步问题解决了,多次请求/accounts接口会导致数据重复累加,这显然不是你想要的结果。


修复方案

我们可以用Promise封装异步逻辑,配合async/await让代码更直观:

export class Account {
  public amount: string;
  public name: string;
  constructor(amount: string, name: string) {
    this.amount = amount;
    this.name = name;
  }
}

// 用Promise包装异步获取账户的操作
function getAccountList(): Promise<Account[]> {
  return new Promise((resolve, reject) => {
    client.getAccounts({}, function (err, accounts) {
      if (err) {
        reject(err); // 错误时传递异常
        return;
      }
      // 直接映射生成新数组,不用全局变量
      const accountList = accounts.map(acct => new Account(acct.balance.amount, acct.name));
      resolve(accountList);
    });
  });
}

// 路由处理改为async函数,等待异步结果
app.get('/accounts', async (req, res) => {
  try {
    const accounts = await getAccountList();
    res.json(accounts); // Express自动处理JSON序列化和响应头
  } catch (err) {
    res.status(500).json({ error: '获取账户列表失败' });
  }
});

修复的关键点:

  1. 用Promise封装异步操作,让我们可以用await等待请求完成,确保拿到数据后再响应客户端。
  2. 移除全局变量,每次请求都生成新的账户数组,避免数据重复。
  3. 用res.json()替代手动序列化,Express会帮我们处理好细节,代码更简洁。

内容的提问来源于stack exchange,提问作者Arayn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:55:40