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

Express路由中使用then或await获取API数据返回undefined问题排查

问题诊断与解决方案

你的问题核心出在处理API响应的JSON解析步骤上——res.json()是异步操作,返回的是一个Promise,你直接访问它的rates属性时,JSON还没完成解析,所以拿到的是undefined。另外还有几个小细节需要调整,我一步步给你讲:

1. 核心错误点:未等待JSON解析完成

在你的getExchangeRates函数里,这段代码有问题:

let api_response = res.json();
return api_response.rates;

res.json()不会立刻返回解析后的对象,它返回的是一个Promise。你需要等待这个Promise完成,才能拿到真正的JSON数据。直接访问api_response.rates相当于在Promise上找rates属性,结果自然是undefined。

2. 修复后的API服务代码

我把你的代码改成了更清晰的async/await写法,同时补全了错误处理的返回值:

require("isomorphic-fetch");
const { DEFAULT_RATES } = require("../resources/other/default_exchange_rates");
// Documentation: https://currencyfreaks.com/documentation.html
let domain = "https://api.currencyfreaks.com/";

/*
* Retrieve exchange rates from USD to other currencies.
* Return object format: {EUR: "2.0293", XXX: "0.55736", ...}
*/
exports.getExchangeRates = async () => {
  try {
    const res = await fetch(`${domain}latest?apikey=${process.env.EXCHANGE_RATE_API_KEY}`);
    
    // 处理API返回非成功状态码的情况
    if (res.status > 200) {
      return DEFAULT_RATES;
    }
    
    // 等待JSON解析完成
    const api_response = await res.json();
    return api_response.rates;
  } catch (err) {
    console.log(err);
    // 出错时返回默认汇率,避免函数返回undefined
    return DEFAULT_RATES;
  }
}

3. 路由代码的小修复

你的路由里有个拼写错误:res.stats(400)应该是res.status(400),不然报错时会抛出异常:

const service = require("../services/currency_api");
const express = require("express");
const router = express.Router();

router.post("/", async (req, res) => {
  try {
    const rates = await service.getExchangeRates();
    return res.status(200).send({ data: rates, status: 200 });
  } catch (err) {
    console.log(err);
    // 修复stats -> status的拼写错误
    return res.status(400).send({ error: "An error occurred", status: 400 });
  }
});

module.exports = router;

为什么这样改能解决问题?

  • 用await res.json()等待JSON解析完成,确保拿到的是真实的响应对象,再访问rates属性就不会是undefined了
  • 把整个逻辑放在try/catch里,出错时返回默认汇率,避免函数返回undefined
  • 修复了路由里的拼写错误,保证错误处理逻辑能正常执行

现在再用Postman测试,应该就能得到包含data字段的正确响应了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 21:17:29