从API获取实时数据到路由

时间:2017-11-05 13:09:32

标签: javascript node.js

我使用以下两个文件从两个API获取数据。请在下面找到我的最小可行示例:

poloniex.js

nrow(tra[,-72])

cctx.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,
}

scheduler.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,
}

我正在运行一个调度程序来汇集这些文件中的数据,但只返回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()

如何正确获取这两个API的数据?

我非常感谢您的回复!

1 个答案:

答案 0 :(得分:2)

我不知道您正在访问的两个API,因此我无法判断您的poloniex.js或cctx.js中的代码是否正常 - 我假设您可以通过console.logs告知,等等,您将从每个单独获取所需的API数据。

但我可以在scheduler.js文件中看到一些逻辑问题:

  1. getAllTickers中,您的.forEach循环会在每次迭代时覆盖res,因此只会看到最后一个结果。
  2. 由于它是async函数,getAllTickers会返回一个承诺。您需要在返回的内容上使用.then或类似内容。
  3. 在setInterval有机会执行之前,console.log和runScheduler中的返回完成,甚至一次,因此没有可用的数据。
  4. 我认为以下设置可能是您想要的:

    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不必是异步的,因为您没有对返回值执行任何操作 - 所有工作都在setInterval回调

    如果您需要提供此数据以响应浏览器请求,则可以从您的数据库中获取它,知道它已在最近3秒内更新。