【问题标题】:Node.js PostgreSQL requests are being terminated prematurelyNode.js PostgreSQL 请求被提前终止
【发布时间】:2015-10-18 23:09:46
【问题描述】:

我正在尝试使用节点在 PostgreSQL 数据库上执行更新,但我得到一个 Error: Connection terminated 执行 UPDATE 操作。在以适当的异步方式处理连接时,我可能搞砸了,过早地终止了它们,但无法弄清楚如何正确执行。

很抱歉有一大堆代码,但它非常简单。

//main.js
var result = require('./processes.js');
result.check(function(message) {
    console.log(message);

});

result.decrease(); //Throws an error.


//workers.js
var pg = require ('pg');
var fs = require('fs');

var db = JSON.parse(fs.readFileSync('../config.json', 'utf8')).db;
var querydb = require('./querydb.js');

var self = module.exports = {
    check: function(callback) {
        querydb.select("SELECT size FROM workers WHERE id = 1", function(results) {
            callback(results[0].size);
        });
    },
    increase: function() {
        self.check(function(workers) {
            querydb.update("UPDATE workers SET size = " + (workers + 1) + " WHERE id = 1");
        });
    },
    decrease: function() {
        self.check(function(workers) {
            querydb.update("UPDATE workers SET size = " + (workers - 1) + " WHERE id = 1");
        });
    }
};


//querydb.js
var pg = require ('pg');
var fs = require('fs');

var db = JSON.parse(fs.readFileSync('../config.json', 'utf8')).db;

var select = function(statement, callback) {
    pg.connect(db, function(err, client, done) {
        var results = [];
        //Handle errors
        if(err) {
            done();
            console.log(err);
        }
        var query = client.query(statement);

        //Stream results back
        query.on('row', function(row) {
            results.push(row);
        });

        //When all data is returned.
        query.on('end', function() {
            done();
            callback(results);
            client.end();
        });
    });
}

var update = function(statement) {
    pg.connect(db, function(err, client, done) {
        var results = [];
        //Handle errors
        if(err) {
            done();
            console.log(err);
        }
        var query = client.query(statement);

        //When all data is returned.
        query.on('end', function() {
            done();
            client.end();
        });
    });
}

module.exports = {
    select: select,
    update: update
};

【问题讨论】:

  • 如果您改用pg-promise,您就不会对连接感到头疼,因为它们会被自动处理。

标签: sql node.js postgresql sql-update


【解决方案1】:

好的,这可能不是答案本身,更多的是一种解决方法,但是对这种脚本(即不是 Web 服务器)进行同步调用是我想要的行为,所以我最终使用 pg-native 而不是 pg 并重构了我的 querydbworkers 模块以使用它,现在一切正常!

【讨论】:

    猜你喜欢
    • 2014-06-11
    • 2014-07-26
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多