嗨,我是 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")})
uj5u.com熱心網友回復:
資料在您的路由中未定義,因為它是在 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);
}
快取回應中的資料以使其隨時可用是另一個問題......
uj5u.com熱心網友回復:
感謝大家的洞察力。我最終采用了快取方法來處理我從中提取的服務的 API 速率限制。我在 server.js 檔案的開頭從 API 呼叫,并添加了一個 setInterval 函式,每 30 分鐘從 API 中提取一次以更新資料,然后將其存盤在快取中。然后我從快取中提取該資料并將其發送到我的“/youtube”快速端點。
這是我的作業代碼,希望它可以幫助與我遇到相同問題的任何其他人。
服務器.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} `)})
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/374095.html
標籤:javascript 节点.js 表达 公理
