【问题标题】:Outputting rows from the pg module in Node / Postgres从 Node / Postgres 中的 pg 模块输出行
【发布时间】:2012-07-05 14:21:23
【问题描述】:

在我的 Node 应用程序中,我想连接到 postgresql 数据库以对实体进行一些工作。但我无法让它与 Node.js 一起使用。我已经用psycopg2从Python脚本中成功连接并查询了数据库,所以我知道连接部分是可以工作的。

var DB_URL = "postgres://admin@localhost/mydb_development"
var db = new pg.Client(DB_URL);
db.connect();

.... more stuff here ....    


app.get('/test', function(request, response) {
  response.setHeader('Content-Type', 'text/plain');
  response.write("First!\n");
  var i = 0;
  var query = db.query("SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'", []);
  query.on('row', function(row) {
    console.log(row['table_name']);
    i++;
    response.write(String(row['table_name']) + "\n");
  });
  response.write("\nHello db; variable i=" + i + "!");
  response.end();
});

我发现 console.log(row['table_name']) 正在成功地将表名输出到控制台。但是,看起来响应变量和 i 在闭包内都不可用......那么我到底应该如何获得查询结果来处理它呢?!

【问题讨论】:

    标签: postgresql node.js


    【解决方案1】:

    response 变量可用但不可写,因为您已经end编辑了它。 i 也应该可用,但在您将其写入响应时,它尚未增加。

    你可能想end它(并写下最后一行)在你得到所有的行之后。可以这样实现:

    var DB_URL = "postgres://admin@localhost/mydb_development"
    var db = new pg.Client(DB_URL);
    db.connect();
    
    .... more stuff here ....    
    
    
    app.get('/test', function(request, response) {
      response.setHeader('Content-Type', 'text/plain');
      response.write("First!\n");
      var i = 0;
      var query = db.query("SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'", []);
      query.on('row', function(row) {
        console.log(row['table_name']);
        i++;
        response.write(String(row['table_name']) + "\n");
      });
      query.on('end', function () {
          response.write("\nHello db; variable i=" + i + "!");
          response.end();
      });
    });
    

    【讨论】:

    • 哦,原来是异步的!现在有道理了!有没有办法说“我希望 JS 等到它结束”......也许使用一个 for 循环来等待,直到设置 'end' 中的变量?大量异步代码是新的意大利面条代码。
    • 您可以使用诸如 async 之类的库来使您的异步代码不那么像意大利面条。如果您将此代码转换为同步代码(例如,按照您的建议使用 for 循环),服务器将无法同时处理多个请求,这将导致无法接受的性能。
    猜你喜欢
    • 2014-12-20
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 2019-07-06
    • 2016-10-28
    • 2016-05-01
    相关资源
    最近更新 更多