2016-11-18 13 views
0

私はpostgresデータベースに接続しようとしています。 connect()に1/2秒以上かかる場合は、タイムアウトして使用できないと仮定します。残念ながら、設定を到達不能なホスト/ポートに変更すると、ETIMEDOUTを取得する前に約15秒のハングタイムが表示されます。次のコードスニペットの例では、到達可能かどうかに関わらず、どのデータベースにも接続するのがidleTimeoutMillisで指定された1msよりも長くかかるため、100%のタイムアウトを期待しています。node-postgresパッケージを使用してpgデータベースに接続する際のタイムアウトを指定しますか?

// npm install pg 
var pg = require("pg"); 
var config = { 
    "host": "myAWS-RDSinstance", 
    "port": 5432, 
    "database": "my_db", 
    "user": "postgres", 
    "password": "foobar", 
    "idleTimeoutMillis": 1 // one millisecond = should timeout every time 
}; 
var pool = new pg.Pool(config); 
pool.connect(function(err, client, done){ 
    if(err) { 
     return console.error('error fetching client from pool', err); 
    } 
    console.log("connected. attempting query."); 

    client.query("SELECT COUNT(*) FROM my_table", function(err, result){ 
     done(); // release client to pool 

     if(err) throw err; 
     console.log(result.rows[0]); 
    }); 
}); 

答えて

0

プール自体のタイムアウトではなく、プールのストリームオブジェクトのタイムアウトを設定する必要があることが判明しました。以下は、ストリームが半秒以上開いている場合にタイムアウトしてストリームを破棄するコードです。

// npm install pg 
var pg = require("pg"); 
var net = require("net"); 

var stream = new net.Stream(); 
stream.setTimeout(500, function(err, data){ 
    console.log("Reached timeout after half a second"); 
    stream.destroy(); 
}); 

var config = { 
    "host": "myAWS-RDSinstance", 
    "port": 5432, 
    "database": "my_db", 
    "user": "postgres", 
    "password": "foobar", 
    "stream": stream 
}; 
var pool = new pg.Pool(config); 
pool.connect(function(err, client, done){ 
    if(err) { 
     return console.error('error fetching client from pool', err); 
    } 
    console.log("connected. attempting query."); 

    client.query("SELECT COUNT(*) FROM my_table", function(err, result){ 
     done(); // release client to pool 

     if(err) throw err; 
     console.log(result.rows[0]); 
    }); 
}); 
+0

この解決策に問題があります。新しいクライアントがプール内に作成されると、(configオブジェクトはpg.Clientに内部的に渡されるため)同じストリームインスタンスを使用しようとします。失敗するのは "/ usr/bin/nodejs [8673]:../src /stream_base.h:233:void node :: StreamBase :: Consume():アサーション '(consumed_)==(false) 'が失敗しました。 – federicojasson

関連する問題