从 API 获取实时数据到路由
Getting real time data from API into route
我正在使用以下两个文件从两个 API 获取数据。请在下面找到我的最小可行示例:
poloniex.js
const Poloniex = require('poloniex-api-node')
const poloniex = new Poloniex()
async function getExchangeTicker() {
poloniex.returnTicker((err, ticker) => {
if (err) {
console.log(err.message)
} else {
//console.log(ticker)
return ticker
}
})
}
module.exports = {
getExchangeTicker,
}
cctx.js
const ccxt = require ('ccxt')
async function getExchangeTicker() {
const bitfinex = new ccxt.bitfinex({ verbose: true })
const data = await bitfinex.fetchTicker()
return data
}
module.exports = {
getExchangeTicker,
}
scheduler.js
const exchangePoloniex = require('../exchange/poloniex')
const exchangeCCTX = require('../exchange/cctx')
async function getAllTickers() {
const exchanges = [
exchangePoloniex,
exchangeCCTX,
]
let res
exchanges.forEach((exchange) => {
res = exchange.getExchangeTicker()
})
return res
}
async function runScheduler() {
let res
setInterval(() => {
this.res = getAllTickers()
}, 3000)
console.log("res: " + res)
return res
}
runScheduler()
我是 运行 一个从这些文件中汇集数据的调度程序,但只得到 res: undefined
回来。
对于如何从这两个 API 正确获取数据有什么建议吗?
非常感谢您的回复!
我不知道你正在访问的两个 API,所以我无法真正判断你来自 poloniex.js 或 cctx.js 的代码是好的 - 我假设你可以通过 console.logs 等告诉您正在分别从每个人那里获得所需的 API 数据。
但是我可以在你的scheduler.js文件中看到一些逻辑问题:
- 在
getAllTickers
中,您的 .forEach
循环每次迭代都会覆盖 res
,因此只有最后一个结果可见。
- 因为它是一个
async
函数,所以 getAllTickers
return 是一个承诺。您需要使用 .then
或类似的东西 returns.
runScheduler
中的 console.log 和 return 在 setInterval 有机会执行之前完成,即使执行一次,所以没有数据可用。
我认为以下设置可能是您想要的:
const exchangePoloniex = require('../exchange/poloniex')
const exchangeCCTX = require('../exchange/cctx')
async function getAllTickers() {
let updatedTickers = []
updatedTickers[0] = await exchangePoloniex.getExchangeTicker()
updatedTickers[1] = await exchangeCCTX.getExchangeTicker()
return updatedTickers
}
function runScheduler() {
let tickers
setInterval(() => {
tickers = getAllTickers()
console.log(tickers) // tickers is a promise at this point
tickers.then((data) => {
console.log(data) // should be the data returned from your apis
// store the data in your db
})
}, 3000)
}
runScheduler()
请注意,runScheduler
不必是异步的,因为您没有对 return 值执行任何操作 - 所有工作都在 setInterval
回调中
如果您需要提供此数据以响应浏览器请求,则可以从您的数据库中获取它,知道它已在过去 3 秒内更新。
我正在使用以下两个文件从两个 API 获取数据。请在下面找到我的最小可行示例:
poloniex.js
const Poloniex = require('poloniex-api-node')
const poloniex = new Poloniex()
async function getExchangeTicker() {
poloniex.returnTicker((err, ticker) => {
if (err) {
console.log(err.message)
} else {
//console.log(ticker)
return ticker
}
})
}
module.exports = {
getExchangeTicker,
}
cctx.js
const ccxt = require ('ccxt')
async function getExchangeTicker() {
const bitfinex = new ccxt.bitfinex({ verbose: true })
const data = await bitfinex.fetchTicker()
return data
}
module.exports = {
getExchangeTicker,
}
scheduler.js
const exchangePoloniex = require('../exchange/poloniex')
const exchangeCCTX = require('../exchange/cctx')
async function getAllTickers() {
const exchanges = [
exchangePoloniex,
exchangeCCTX,
]
let res
exchanges.forEach((exchange) => {
res = exchange.getExchangeTicker()
})
return res
}
async function runScheduler() {
let res
setInterval(() => {
this.res = getAllTickers()
}, 3000)
console.log("res: " + res)
return res
}
runScheduler()
我是 运行 一个从这些文件中汇集数据的调度程序,但只得到 res: undefined
回来。
对于如何从这两个 API 正确获取数据有什么建议吗?
非常感谢您的回复!
我不知道你正在访问的两个 API,所以我无法真正判断你来自 poloniex.js 或 cctx.js 的代码是好的 - 我假设你可以通过 console.logs 等告诉您正在分别从每个人那里获得所需的 API 数据。
但是我可以在你的scheduler.js文件中看到一些逻辑问题:
- 在
getAllTickers
中,您的.forEach
循环每次迭代都会覆盖res
,因此只有最后一个结果可见。 - 因为它是一个
async
函数,所以getAllTickers
return 是一个承诺。您需要使用.then
或类似的东西 returns. runScheduler
中的 console.log 和 return 在 setInterval 有机会执行之前完成,即使执行一次,所以没有数据可用。
我认为以下设置可能是您想要的:
const exchangePoloniex = require('../exchange/poloniex')
const exchangeCCTX = require('../exchange/cctx')
async function getAllTickers() {
let updatedTickers = []
updatedTickers[0] = await exchangePoloniex.getExchangeTicker()
updatedTickers[1] = await exchangeCCTX.getExchangeTicker()
return updatedTickers
}
function runScheduler() {
let tickers
setInterval(() => {
tickers = getAllTickers()
console.log(tickers) // tickers is a promise at this point
tickers.then((data) => {
console.log(data) // should be the data returned from your apis
// store the data in your db
})
}, 3000)
}
runScheduler()
请注意,runScheduler
不必是异步的,因为您没有对 return 值执行任何操作 - 所有工作都在 setInterval
回调中
如果您需要提供此数据以响应浏览器请求,则可以从您的数据库中获取它,知道它已在过去 3 秒内更新。