2016-07-18 51 views
0

在我的代碼中,我希望從訂閱源接收「訂單」並將其存儲在數據庫中。網絡套接字和數據庫對象範圍

我知道,只要收到數據,就會調用類方法marketEvent,因此我需要在此函數中使用我的insert語句。

每次調用類方法時打開和關閉數據庫連接都是低效的,所以我試圖打開連接並將db對象傳遞給marketEvent。

我是新來的nodejs和網絡套接字,所以不能解決如何把它放在一起。

var pg = require("pg") 
var conString = "postgres://myusername:[email protected]/poloniex"; 
var client = new pg.Client(conString); 


var autobahn = require('autobahn'); 
var wsuri = "wss://api.poloniex.com"; 
var connection = new autobahn.Connection({ 
    url: wsuri, 
    realm: "realm1" 
}); 

connection.onopen = function (session) { 
    function marketEvent (args,kwargs) { 
     client.query("INSERT INTO orderbook(order) values($1)", [args]); 
    } 
    session.subscribe('BTC_XMR', marketEvent); 

} 

connection.onclose = function() { 
    console.log("Websocket connection closed"); 
} 


client.connect(); 
connection.open(); 

回答

0

我不知道「pg」和「autobahn」兩者。但是從「pg」包的文檔中,我可以爲您提供一些解決方案

client.connect()並不意味着是一個孤立的調用。它期望一個函數委託來執行操作。

connection.onopen = function (session) { 
    function marketEvent (args,kwargs) { 
     client.connect(function(err) { 
      if (err) throw err; 
      client.query("INSERT ...", [args]); 
     }); 
    } 
    session.subscribe('BTC_XMR', marketEvent); 

} 

關於高效地使用連接,你可能會問我想要的池。

var pool = new pg.Pool(config); 
pool.connect(function(err, client, done) { 
    if (err) throw err; 
    client.query('INSERT ...', function(err, result) { 
     //call `done()` to release the client back to the pool 
     done(); 
    }); 
}); 

請參考這個建議的原始來源的確切用法: https://www.npmjs.com/package/pg