我尝试使用bitfinex库(https://www.npmjs.com/package/bitfinex)从Bitfinex调用rest API。当使用相同的API密钥同时运行多个进程时,文档警告此错误。但是,我相信我只是立即运行一个进程,即使我生成新的API密钥,错误仍然会发生。我正在考虑重写nonce或扩展它但我不知道如何做到这一点。我曾在互联网上尝试过一些建议,但仍然无效。
以下是我的参考代码:
import Bitfinex = require('bitfinex');
import pollingtoevent = require('polling-to-event');
import { Logger, LoggerFactory } from '../../common';
import { AppDataServices } from '../../data';
export class BitfinexPoller {
private static readonly LOGGER: Logger = LoggerFactory.getLogger();
private bitfinex: any = undefined;
private emitter: any = undefined;
private public_key: string = '<my-public-key>';
private secret_key: string = '<my-secret-key>';
private nonce: any = new Date().getTime();
constructor(private appServices: AppDataServices) {
BitfinexPoller.LOGGER.info('Bitfinex poller init');
this.bitfinex = new Bitfinex(this.public_key, this.secret_key, this.nonce);
// Lend book service
this.emitter = pollingtoevent((done: any) => {
this.bitfinex.lendbook('USD', (err: any, res: any, orderId: any) => {
done(err, res);
});
}, { interval: 30000, eventName: 'bitfinex-lending' });
this.emitter.on('bitfinex-lending', (data: any) => {
BitfinexPoller.LOGGER.info(data);
if (data.bids !== undefined) {
for (const row of data.bids) {
appServices.lendbookService.insert(BitfinexPoller.lendingData('BID', row));
}
}
if (data.asks !== undefined) {
for (const row of data.asks) {
appServices.lendbookService.insert(BitfinexPoller.lendingData('ASK', row));
}
}
});
// Order book service
this.emitter = pollingtoevent((done: any) => {
this.bitfinex.orderbook('btcusd', (err: any, res: any, orderId: any) => {
done(err, res);
});
}, { interval: 30000, eventName: 'bitfinex-order' });
this.emitter.on('bitfinex-order', (data: any) => {
BitfinexPoller.LOGGER.info(data);
if (data.bids !== undefined) {
for (const row of data.bids) {
appServices.lendbookService.insert(BitfinexPoller.orderData('BID', row));
}
}
if (data.asks !== undefined) {
for (const row of data.asks) {
appServices.lendbookService.insert(BitfinexPoller.orderData('ASK', row));
}
}
});
}
}
答案 0 :(得分:5)
您最有可能快速连续发起两次经过身份验证的呼叫。您发送请求的顺序并不总是与它们处理的顺序相同,因此首先处理具有较高nonce的第二个请求,导致第一个请求失败。
您可以为不同的请求创建和使用多个API密钥,或者拥有一个循环使用的池,这样您就不会连续多次使用相同的api密钥。
答案 1 :(得分:0)
我对nodejs的解决方案是通过promise延迟调用。
类似这样的东西:
function sleep(millis) {
return new Promise(resolve => setTimeout(resolve, millis));
}
sleep(500).then(() => {
//do work
});
sleep(600).then(() => {
//do work
});
很明显,如果您正在寻找极低的延迟和极高的速度,那么这不适合您。