使用 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);
fetch
response.json()
方法return是一个承诺,因此要获得实际值,您要么等待它,要么return承诺并添加另一个.then
等待 res.json()
解决。
反过来,当您不等待 res.json()
时,您的 promise 解析为 undefined
(api_response
是一个 promise,rates
是 undefined
), 然后 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);
})
);
}
问题
我正在创建一个从 API 获取货币汇率的快速服务器。在路由中,我通过辅助函数获取这些汇率,然后我想 return 在格式为 {data: rates, status: 200}
.
但是,由于汇率未定义(待定承诺),因此从路线中 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);
fetch
response.json()
方法return是一个承诺,因此要获得实际值,您要么等待它,要么return承诺并添加另一个.then
等待 res.json()
解决。
反过来,当您不等待 res.json()
时,您的 promise 解析为 undefined
(api_response
是一个 promise,rates
是 undefined
), 然后 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);
})
);
}