【问题标题】:is it possible to use node js Postgres client in blocking / synchronous way是否可以以阻塞/同步方式使用节点 js Postgres 客户端
【发布时间】:2014-08-14 09:13:31
【问题描述】:

我正在寻找一个节点 js 客户端来连接到 PostgreSQL 8.3 并以同步阻塞模式运行我的查询(用于脚本而不是 Web 服务器)。

我目前正在使用https://github.com/brianc/node-postgres 效果很好,但它只支持异步。

谢谢,

肖恩。

【问题讨论】:

  • 这是XY problem。你需要的是学习处理异步编程。 Promises may help you.
  • 我一直在异步编程,但有时你想要一个快速的脏脚本,同步是一种更好更简单的方法......
  • 如果你觉得需要为此寻找不同的驱动程序,那么你做错了异步,我猜你不使用承诺。干净的驱动程序不应阻塞。
  • 不相关但:Postgres 8.3 已停产,不再受支持。您应该升级到受支持的版本 (9.x)
  • 您的查询是什么,为什么您必须从 nodejs 中调用所有这些查询?您可以将多个查询包装在一个或多个子存储函数中,并从 nodejs 调用一个调用所有子的主存储函数。这样你就有一个 nodejs 调用和许多查询执行。

标签: node.js postgresql


【解决方案1】:

您可以使用异步串行模式以同步方式运行查询并避免多个回调结构:Async.series

pg.connect(configDB.connectionString, function(err, client, done) {
    if (err) { return console.error(err); }

    var condition = true;
    async.series([
        CreateExtensions,
        PushSQL,
        function (next) {
            if (condition) {
                UpdateTable(id, name, next);
            }
            else {
                next();
            }
        }
    ],
    function(err, results) {
        if (err) { console.error(err); }
        client.end();
        pg.end();
    });

    function CreateExtensions(callback)  {
        var queryConfig = 'CREATE EXTENSION postgis; CREATE EXTENSION hstore;';
        client.query(queryConfig, function(err) {
            return callback(err);
        });
    }

    function PushSQL(callback)  {
        var queryConfig = fs.readFileSync("./database/cmdb.sql", 'utf8');
        client.query(queryConfig, function(err) {
            return callback(err);
        });
    }

    function UpdateTable(id, name, callback) {
        var queryConfig = "UPDATE table SET name = '" + name + "' WHERE id = " + id + ";";
        client.query(queryConfig, function(err) {
            condition = false;
            return callback(err);
        });
    }
});

【讨论】:

  • 感谢您的评论,但是,如果您想在其中一个函数中放置一个条件语句怎么办,例如:如果(某事)执行另一个 SQL 选择查询,您将无法放置它在外部主要 async.series 对吗?你的代码将再次变成金字塔,对吗?同样,我非常熟悉异步编程,但有时会寻找一种快速的非 Web 服务器类型脚本,其中同步是理想的
  • 为了解决您的问题,我在 async.series 中添加了一个带有条件语句的示例。您还可以使用像我的示例这样的匿名函数将参数传递给查询函数。
  • tx 用于回复,但是您如何将变量 'condition' 传递给 function (next) { ?因为它与我们说的 PushSQL 不在同一个范围内......你需要声明一个全局变量条件或至少在堆栈变量中声明一个高位......对吗?
  • 是的,您可以在 pg.connect 范围内使用变量(我在示例中添加了一个变量)。另外,如果你想将参数传递给 async.series 中的一个函数,你可以使用 async.waterfall。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多