【问题标题】:pg.connect not a function?pg.connect 不是一个函数?
【发布时间】:2017-12-23 18:07:00
【问题描述】:

似乎有很多文档(例如https://devcenter.heroku.com/articles/heroku-postgresql#connecting-in-node-js,但也包括本网站在内的其他地方)表明与 pg.js 节点包连接的正确方法是使用 pg.connect。但是,我尝试(在我的实际代码出现之前的问题之后)使用上述 Heroku 文档中显示的确切代码进行测试:

var pg = require('pg');

pg.defaults.ssl = true;
pg.connect(process.env.DATABASE_URL, function(err, client) {
  if (err) throw err;
  console.log('Connected to postgres! Getting schemas...');

  client
    .query('SELECT table_schema,table_name FROM information_schema.tables;')
    .on('row', function(row) {
      console.log(JSON.stringify(row));
    });
});

我收到错误消息“pg.connect 不是函数”。发生了什么,我该如何解决?

【问题讨论】:

    标签: node.js heroku pg


    【解决方案1】:

    pg 的新版本,即 7.0.0,大约在 15 小时前发布(从我写这篇文章开始)。

    这个版本有很多变化,其中之一是pg.connect 已被硬弃用(换句话说:删除)以支持pg.Pool(...).connect(...),如下所述:https://node-postgres.com/guides/upgrading

    新的连接方式如下:

    var pool = new pg.Pool()
    
    // connection using created pool
    pool.connect(function(err, client, done) {
      client.query(/* etc, etc */)
      done()
    })
    
    // pool shutdown
    pool.end()
    

    许多旧文档不会反映这些更改,因此他们使用的示例代码将不再适用。

    您可以尝试重写示例代码以使其在 7.0.0 中运行,或者显式安装仍可与示例代码一起使用的旧版本:

    npm install pg@6
    

    【讨论】:

      【解决方案2】:

      pg: postgresql => (https://www.npmjs.com/package/pg)

      ⚠️ pg.connect 自 6.3 版起已弃用 ❌

      小心:取而代之的是另一种方法称为pool

      以下是您可以使用express 轻松设置node-postgres 的方法。

      const pg        = require('pg');
      const express   = require('express');
      const app       = express();
      
      const config = {
          user: 'postgres',
          database: 'YOURDBNAME',
          password: 'YOURPASSWORD',
          port: 5432                  //Default port, change it if needed
      };
      
      // pool takes the object above -config- as parameter
      const pool = new pg.Pool(config);
      
      app.get('/', (req, res, next) => {
         pool.connect(function (err, client, done) {
             if (err) {
                 console.log("Can not connect to the DB" + err);
             }
             client.query('SELECT * FROM GetAllStudent()', function (err, result) {
                  done();
                  if (err) {
                      console.log(err);
                      res.status(400).send(err);
                  }
                  res.status(200).send(result.rows);
             })
         })
      });
      
      app.listen(4000, function () {
          console.log('Server is running on port 4000');
      });
      

      【讨论】:

        【解决方案3】:
        var express = require('express');
        var app = express();
        const pgp = require('pg-promise')();
        var connectionString = "";
        var parse = require('pg-connection-string').parse;
        
        try {
            var connectionString = "postgres://USERNAME:@localhost:5432/DBNAME";
            var config = parse(connectionString);
            config.password = "PASSWORD";
            var dbcon = pgp(config);
            app.set('dbCon', dbcon);
        } 
        catch (error) {
            console.log("DB error")
        } 
        

        module.exports = 应用程序;

        【讨论】:

          【解决方案4】:

          如果您想坚持使用现有代码,可以使用旧版本的 Postgres。

          首先,申请:

          npm uninstall postgresql
          

          然后安装6.1.2版(与你提到的代码兼容):

          npm install pg@6.1.2
          

          【讨论】:

            猜你喜欢
            • 2017-11-26
            • 1970-01-01
            • 2016-07-08
            • 2013-03-03
            • 2022-01-09
            • 2018-03-12
            • 2017-08-17
            • 2017-09-22
            • 2018-12-16
            相关资源
            最近更新 更多