我无法使此获取请求在.get()请求中工作。它独立运行,在console.log上显示“第一个播放器”会返回我想要的数据,但是,当我在router.get()中调用此函数时,我不确定(在get中显示“ console.log” '返回未定义)。
const fetchPlayers = () => {
const url = "https://www.fantasyfootballnerd.com/service/draft-rankings/json/test"
let res = fetch(url)
.then(res => res.json())
.then(data => {
console.log(data.DraftRankings[0], 'first player')
return data.DraftRankings[0]
})
}
router.get('/', async (req, res)=> {
try {
const players = await fetchPlayers();
console.log(players, 'in the get');
res.json(players)
} catch (err) {
res.json({message: err})
}
})
我只希望能够发出提取请求并能够在router.get()中使用该数据。
答案 0 :(得分:3)
您只能await
能返回承诺的东西。您可以通过使函数成为异步函数来强制其返回promise,从而解决此问题。
const fetchPlayers = async () => {
const url = "https://www.fantasyfootballnerd.com/service/draft-rankings/json/test"
const response = await fetch(url)
return response.json()
}
router.get('/', async (req, res)=> {
try {
const players = await fetchPlayers();
console.log(players, 'in the get');
res.json(players)
} catch (err) {
res.json({message: err})
}
})
此外,您将要使用try catch语句来处理提取请求中的错误。尽管如果您不能在响应对象上调用json,它仍然会拒绝诺言。
答案 1 :(得分:1)
问题是这一行:
let res = fetch(url)...
此时res
拥有一个Promise
。
解决方法是从调用的函数返回:
async function fetchPlayers() {
const url = "https://www.fantasyfootballnerd.com/service/draft-rankings/json/test"
let res = await fetch(url)
.then(res => res.json())
.then(data => {
console.log(data.DraftRankings[0], 'first player')
return data.DraftRankings[0]
})
return res;
}
您可以通过在整个过程中使用await
语法来使其更具可读性:
async function fetchPlayers() {
const url = "https://www.fantasyfootballnerd.com/service/draft-rankings/json/test"
const request = await fetch(url);
const data = await request.json();
console.log(data.DraftRankings[0], 'first player');
return data.DraftRankings[0];
}
通常,如果您混合使用await
和.then()
,则可以将每个x(...).then(y => ...
转换为const y = await x(...);