【问题标题】:How to deal with rate limited API services using React/Node.js? (ReferenceError)如何使用 React/Node.js 处理速率受限的 API 服务? (参考错误)
【发布时间】:2022-01-09 11:22:09
【问题描述】:

您好,我是 React 和 NodeJS 的新手,目前我正在尝试解决从速率受限的 API 服务中提取的方法。我的想法是让 NodeJS 每 30 分钟左右从 API 服务中提取数据,并将其发送到我的快速“/youtube”端点,以便我的前端能够无限地从中提取数据。但是我不知道这是否是最佳实践,而且我的代码也遇到了 ReferenceError。任何帮助将不胜感激。

我可以使用 console.log(data),所以我知道该变量已定义,但我不确定如何正确地将它传递给 app.get()。

错误

ReferenceError: data is not defined

代码

const express = require('express')
const axios = require('axios')
const app = express()


const url = "**Youtube API URL**"

axios.get(url)
        .then((response) => {
            let data = response.data.items
            console.log("Posted data")
            console.log(data)
        })
        .catch(
            err => console.log(err)
        )

app.get("/youtube", (req,res) => {
    res.send(data)
})

app.listen(5000, () => {console.log("server started on port 5000")})

【问题讨论】:

  • 使用 Tor 节点和线程
  • 我认为缓存来自速率限制 API 的响应,以便您可以从自己的端点无限次调用它,这非常好,所以您应该很好。至于您对data is undefined 的问题,您需要发布更多详细信息。你的 axios 响应对象是什么样的?

标签: javascript node.js express axios


【解决方案1】:

您的路由中未定义数据,因为它是在您的 axios get 回调的回调中定义的。即使是在 axios 调用之前定义的,它仍然是未定义的,因为 api 调用是一个异步操作...

一个简单的解决方案是在路由回调中调用 axios,并在 axios 回调中发送响应。尽管有大量的编码技术/模式可以解决这个问题,但这有助于说明您的问题:

app.get("/youtube", (req,res) => {

    axios.get(url)
    .then((response) => {
        let data = response.data.items
        console.log("Posted data")
        console.log(data)
        res.send(data)
    })
    .catch(
        err => console.log(err)
    )
    
})

当然,您可以创建一个异步函数并在路由中调用它:

async function makeCall() {
    const data = await axios.get(url)
    .then((response) => {
        let resdata = response.data.items
        return resdata
    })
    .catch(
        err => console.log(err)
    )
    return data;
}

然后在你的路线上:

 app.get("/youtube", async (req,res) => {
     const data = await makeCall();
     res.send(data);
 }

从响应中缓存数据以使其随时可用完全是另一个问题...

【讨论】:

    【解决方案2】:

    感谢大家的见解。我最终采用了缓存方法来处理我从中提取的服务的 API 速率限制。我在 server.js 文件的开头从 API 进行调用,并添加了一个 setInterval 函数以每 30 分钟从 API 中提取一次以更新数据,然后将其存储在缓存中。 然后我从缓存中提取数据并将其发送到我的“/youtube”快速端点。

    这是我的工作代码,希望它可以帮助遇到与我遇到相同问题的其他人。

    server.js

    const axios = require('axios')
    const NodeCache = require('node-cache')
    const express = require('express')
    const cors = require('cors')
    const app = express()
    app.use(cors())
    
    const port = process.env.PORT || 4000
    const url = " **Youtube API url** "
    const myCache = new NodeCache();
    
    function initialCall(){
        axios.get(url)
            .then((response) => {
                const result = response.data.items
                myCache.set("key", result)
                console.log("Retrived from API")
            })
            .catch(
                err => console.log(err)
            )
    }
    
    initialCall()
    setInterval(initialCall, 1800000)
    
    app.get("/", (req,res) => {
        const welcome = "Welcome"
        res.send(welcome)
    })
    
    app.get("/youtube", (req,res) => {
        if(myCache.get("key")){
            res.send(myCache.get("key"))
            console.log("Retrieved from cache")
        }
    })
    
    app.listen(port, () => {console.log(`server started on port: ${port} `)})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-13
      • 1970-01-01
      • 1970-01-01
      • 2018-08-07
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多