在.get()请求中返回访存

时间:2020-06-30 19:04:06

标签: javascript node.js json express fetch

我无法使此获取请求在.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()中使用该数据。

2 个答案:

答案 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(...);