javascript - 在使用 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
}
*/
解决方案
更改回调包含:
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()
你的承诺解析为undefined
(api_response
是一个承诺,并且rates
是undefined
),然后data
也是undefined
推荐阅读
- php - 在 Laravel 中以一对多多态关系从数据库中获取数据的问题
- c++ - 为什么(Qt 5.15.2)STL 风格的反向迭代器不能用于从头到尾的打印?
- javascript - Jquery Datepicker、字符串连接和#selector
- python - 如何在python中使用迭代器作为变量名?
- powershell - PowerShell 中的递归斐波那契
- sql-server - 您可以为多个 SQL Server 实例使用 1 个 ssrs 报告服务器(和报告)吗
- git - git name-rev tag 语法含义?
- git - 推送分支时 Jenkins Git Publish 失败;没有显示标准错误
- typescript - 如何告诉 TypeScript object[foo] 的类型是所有可能的 object.prop 类型的子集
- web-config - 生产中的会话状态更改,但测试 Web 服务器上没有