首页 > 解决方案 > 在使用 then 或 await 时,在 express 路由中获取 API 数据返回未定义

问题描述

问题

我正在创建一个从 API 获取货币汇率的快递服务器。在路线中,我通过辅助函数获取这些汇率,然后我想在格式的响应正文中返回它们{data: rates, status: 200}

但是,从路线返回的唯一内容是{status: 200}汇率未定义(待定承诺)。fetch 成功完成,即没有被 catch 子句捕获,也没有返回默认结果。他们的关键“利率”也存在。

我不明白为什么这是未定义的,也不明白如何修复它,因为我在从路线返回之前等待服务的响应。我也尝试过将路由器响应封装在一个.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
 }

*/

标签: javascriptexpressasync-awaitundefinedrouter

解决方案


更改回调包含:

let api_response = res.json();

至:

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

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

fetch response.json()方法返回一个promise,因此要获得实际值,您要么必须等待它,要么返回promise 并添加另一个.then等待res.json()解决。

反过来,当你不等待res.json()你的承诺解析为undefinedapi_response是一个承诺,并且ratesundefined),然后data也是undefined


推荐阅读