使用node-postgres包指定连接到pg数据库的超时时间?

时间:2016-11-18 16:41:31

标签: node.js postgresql node-postgres

我试图连接到postgres数据库。如果连接()需要超过1/2秒,我只是想超时并假设它不可用。不幸的是,如果我将配置更改为无法访问的主机/端口,我会在获得ETIMEDOUT之前看到大约15秒的挂起时间。在下面的代码片段示例中,我预计它会100%超时,因为连接到任何数据库,无论是否可以访问,都需要花费超过1毫秒的时间,在idleTimeoutMillis中指定。

// 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]);
    });
});

1 个答案:

答案 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]);
    });
});