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

Fastify的async/await handler处理Moralis数据返回空数组如何解决

问题根因

返回空数组的问题完全是异步执行逻辑错误导致的:

  • Array.prototype.forEach 方法本身不支持等待异步任务,你在循环内部用 .then() 触发的getTokenPair、checkTokenPrice都是异步接口调用,这些任务会被推入事件循环队列等待执行,主线程不会等待它们完成,就会直接执行后面的sort排序和return userBalances逻辑,此时数组还没有被任何异步回调写入数据,所以返回空。
  • 你最终实现里改用for...of循环配合await串行执行每个token的校验逻辑,相当于强制主线程等待每个token的异步校验全部完成后,再往下执行返回逻辑,自然就能拿到正确的过滤结果。
可选优化点

1. 正则简化

原来的6条名称过滤正则可以合并为1条,开启不区分大小写匹配即可,代码更简洁:

if (!token.name.match(/^.*\.(io|net|com|org)$/i))

2. 性能优化

当前for...of是串行处理所有token,如果token数量较多接口调用耗时会很长,可以改用Promise.all并行处理所有校验任务,提升接口响应速度:

// 先过滤掉名称不符合要求的token,再批量生成异步校验任务
const filterTasks = userTokens
  .filter(token => !token.name.match(/^.*\.(io|net|com|org)$/i))
  .map(async token => {
    const value = await getTokenPair(token)
    if (value <= 2) return null
    const price = await checkTokenPrice(token)
    return price > 0.001 ? token : null
  })
// 等待所有任务执行完成,过滤掉不符合要求的空值
const userBalances = (await Promise.all(filterTasks)).filter(Boolean)
// 按USD估值降序排序
userBalances.sort((a, b) => b.total_value_usd - a.total_value_usd)

内容的提问来源于stack exchange,提问作者Jo Le Belge

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 21:15:02