使用 then 或 await 时未定义在快速路线 returns 内获取 API 数据

Fetching API data inside express route returns undefined when using then or await

问题

我正在创建一个从 API 获取货币汇率的快速服务器。在路由中,我通过辅助函数获取这些汇率,然后我想 return 在格式为 {data: rates, status: 200}.

的响应正文中 return 它们

但是,由于汇率未定义(待定承诺),因此从路线中 return 唯一得到的是 {status: 200}。提取成功通过,即没有被 catch 子句捕获,默认结果也没有被 returned。他们的关键 'rates' 也存在。

我不明白为什么这是未定义的,也不知道如何修复它,因为我在从路由 returning 之前等待服务的响应。我也尝试将路由器响应封装在 .then 子句中而不是使用 await 但我遇到了同样的问题。

API 服务获取

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 () => {
  return await (
    fetch(`${domain}latest?apikey=${process.env.EXCHANGE_RATE_API_KEY}`)
      .then((res) => {
        if (res.status > 200) {
          return DEFAULT_RATES;
        }
        let api_response = res.json();
        return api_response.rates; 
      })
      // Catch parse error
      .catch((err) => {
        console.log(err);
      })
  );
}

路线


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);
    return res.stats(400).send({ error: "An error occurred", status: 400 });
  }
});

module.exports = router;

/*
 Postman test response:
 {
   "status": 200
 }

*/

更改回调包含:

let api_response = res.json();

收件人:

  .then((res) => {
    if (res.status > 200) {
      return DEFAULT_RATES;
    }
    return res.json();

  })
  .then(api_response => api_response.rates); 

fetchresponse.json()方法return是一个承诺,因此要获得实际值,您要么等待它,要么return承诺并添加另一个.then 等待 res.json() 解决。

反过来,当您不等待 res.json() 时,您的 promise 解析为 undefinedapi_response 是一个 promise,ratesundefined), 然后 data 也是 undefined

使用 baldrs answer 的工作解决方案

exports.getExchangeRates = () =>{
  let url = `${domain}latest?apikey=${process.env.EXCHANGE_RATE_API_KEY}`;
  return (
    fetch(url)
      .then((res) => {
        if (res.status > 200) {
          return DEFAULT_RATES;
        }
        return res.json();
      })
      .then((data) => data.rates)

      .catch((err) => {
        console.log(err);
      })
  );
}