Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js,bitfinex api节点:如何正确设置以处理来自websocket连接的数据_Javascript_Node.js_Npm_Websocket - Fatal编程技术网

Javascript Node.js,bitfinex api节点:如何正确设置以处理来自websocket连接的数据

Javascript Node.js,bitfinex api节点:如何正确设置以处理来自websocket连接的数据,javascript,node.js,npm,websocket,Javascript,Node.js,Npm,Websocket,请为这个问题的标题不准确表示歉意,我不是一个有经验的程序员,在node.js中更是如此 我的意图很简单:我想使用我通过npm安装的bitfinex api节点包(bitfinex cryptocurrency exchange的node.js包装),从交易所读取各种货币对的价格数据,以计算更好的交易策略 readme.md中提供的示例代码运行良好,这是一个精简版本,创建一个BFX对象,该对象订阅给定货币对的股票代码,并不断输出股票代码数据: const BFX = require('bitfin

请为这个问题的标题不准确表示歉意,我不是一个有经验的程序员,在node.js中更是如此

我的意图很简单:我想使用我通过npm安装的bitfinex api节点包(bitfinex cryptocurrency exchange的node.js包装),从交易所读取各种货币对的价格数据,以计算更好的交易策略

readme.md中提供的示例代码运行良好,这是一个精简版本,创建一个BFX对象,该对象订阅给定货币对的股票代码,并不断输出股票代码数据:

const BFX = require('bitfinex-api-node')

const API_KEY = 'secret'
const API_SECRET = 'secret'

const opts = {
  version: 2,
  transform: true
}

const bws = new BFX(API_KEY, API_SECRET, opts).ws


bws.on('open', () => {
  bws.subscribeTicker('BTCUSD') 
})

bws.on('ticker', (pair, ticker) => {
  console.log('Ticker:', ticker)
})

bws.on('error', console.error)
到目前为止还不错。现在,为了一个简单的例子,让我们假设我想要得到两个货币对(BTC/USD,ETH/USD)的当前价格,并将它们添加到显示结果中。我显然很天真的做法是这样的:

const BFX = require('bitfinex-api-node')

const API_KEY = 'secret'
const API_SECRET = 'secret'

const opts = {
  version: 2,
  transform: true
}

const bws1 = new BFX(API_KEY, API_SECRET, opts).ws
const bws2 = new BFX(API_KEY, API_SECRET, opts).ws

var priceBTCUSD;
var priceETHBTC;

bws1.on('open', () => {
  bws1.subscribeTicker('BTCUSD') 
})
bws2.on('open', () => {
  bws2.subscribeTicker('ETHUSD') 
})

bws1.on('ticker', (pair, ticker) => {
  //console.log('Ticker1:', ticker.LAST_PRICE)
  priceBTCUSD = ticker.LAST_PRICE
})
bws2.on('ticker', (pair, ticker) => {
  //console.log('Ticker2:', ticker.LAST_PRICE)
  priceETHBTC = ticker.LAST_PRICE
})

bws1.on('error', console.error)
bws2.on('error', console.error)
//HERE IT COMES:
console.log(priceBTCUSD+priceETHBTC)
其中,最后一行的结果输出为“NaN”。在BFX对象建立连接并接收任何数据之前,似乎执行了将所需结果记录到控制台的最后一行

我如何正确设置它?如何从接收到的数据流中检索数据?我真的需要每个货币对一个BFX websocket对象吗?如何读取一次价格数据,关闭websocket连接(读取一次价格后不需要该连接),然后重新连接以读取不同货币对的价格

谢谢大家!!如果我的问题不够清楚,请随时索取更多数据

亲切问候,,
哦,你的console.log太快了。试试这个(我跳过了几行):


现在,这不是最好的方法,但它让你的地面。更好的方法是在同一个websocket上查询两个价格,因此当您返回两个价格时,请调用此函数计算结果。

谢谢!虽然这不是postet问题的完整答案,但它确实让我重新思考了我的方法。我的程序不再试图从websocket流对象获取数据,而是将我的程序“基于”在websocket函数中(我希望您知道我的意思,就像您给出的示例一样),并从内部进行各种调用。不确定这是否是预期的方式,但现在它的工作!再次感谢你!嗯,你通常把你的程序建立在一组模块的基础上。一个模块用于处理websocket通信。传入消息路由到适当的业务组件。任何“客户机”都会调用此模块以获取传出消息。现在,您的业务组件,它们各自处理自己的事情。例如,其中一个将处理所有传入的“ticker”消息。其中一个将处理价格比较。等等,所以你不写程序“在websocket内部”。您只有一些路由功能,根据传入的内容,将消息路由到适当的服务或模块。
bws1.on('ticker', (pair, ticker) => {
  //console.log('Ticker1:', ticker.LAST_PRICE)
  priceBTCUSD = ticker.LAST_PRICE;
  printResults();
})
bws2.on('ticker', (pair, ticker) => {
  //console.log('Ticker2:', ticker.LAST_PRICE)
  priceETHBTC = ticker.LAST_PRICE
  printResults();
})

bws1.on('error', console.error)
bws2.on('error', console.error)
//HERE IT COMES:
function printResults() {
  if (priceBTCUSD && priceETHBTC)
    console.log(priceBTCUSD+priceETHBTC)  
}