【问题标题】:Specify timeout to connect to pg database using node-postgres package?使用 node-postgres 包指定超时以连接到 pg 数据库?
【发布时间】:2016-11-18 16:41:31
【问题描述】:

我正在尝试连接到 postgres 数据库。如果连接()需要超过 1/2 秒,我只想超时并假设它不可用。不幸的是,如果我将配置更改为无法访问的主机/端口,我会在收到 ETIMEDOUT 之前看到大约 15 秒的挂起时间。在下面的代码 sn-p 示例中,我希望它在 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]);
    });
});

【问题讨论】:

    标签: node.js postgresql node-postgres


    【解决方案1】:

    原来你需要为池的流对象设置超时,而不是池本身的超时。下面的代码会在流打开超过半秒时超时并销毁。

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

    【讨论】:

    • 我遇到了这个解决方案的问题。在池中创建新客户端时,它将尝试使用相同的流实例(因为配置对象在内部传递给 pg.Client),失败并显示:“/usr/bin/nodejs[8673]: ../src /stream_base.h:233:void node::StreamBase::Consume(): 断言 `(consumed_) == (false)' 失败。”
    猜你喜欢
    • 2016-10-28
    • 2020-05-26
    • 2016-01-05
    • 2016-06-18
    • 2017-10-06
    • 2021-03-07
    • 2016-03-30
    • 2022-07-08
    • 2014-05-06
    相关资源
    最近更新 更多