【问题标题】:TypeError: Cannot call method 'query' of null - when calling pg.connect with Heroku node.jsTypeError:无法调用 null 的方法“查询”-使用 Heroku node.js 调用 pg.connect 时
【发布时间】:2014-08-05 02:58:52
【问题描述】:

我在通过 Node.js 连接到 Heroku postgres 数据库时遇到问题。我发现有人遇到此问题的另一个实例,但他们的建议在我的情况下不起作用。

我将 var DB_URL 定义为 Heroku 存储的完整 Postgres 数据库 URL。我这样做是因为没有定义 process.env.DATABASE_URL。 (这是另一个堆栈溢出帖子的建议)。

尝试连接的代码是:

pg.connect(DB_URL, function(err, client) {
    client.query( ... )

运行工头时:

client.query('INSERT INTO bookmarks (username, title, image, url) VALUES (       
^
TypeError: Cannot call method 'query' of null

这里的 null 指的是要传递给 pg.connect 匿名函数的客户端对象。

感谢您的建议,我在 Heroku 文档和 Google 上搜索过很多次,但无济于事。

【问题讨论】:

    标签: node.js postgresql heroku


    【解决方案1】:

    我对您连接到数据库的方式不是很熟悉,但我会这样做。也许你可以试试这个作为替代方案。这对我有用。

    var pg = require('pg');
    
    // Get your USER, PW (password) , HOST, PORT, and DATABASE variables from heroku
    // so that you can put them in your connection string.
    
    var conString = "pg://" + USER + ":" + PW + "@" + HOST + ":" + PORT + "/"
        + DATABASE + "?ssl=true";
    var client = new pg.Client(connString);
    
    
    // Now you can start querying your database. Here is a sample. 
    
    client.connect(function(err) {
       if (err) { 
         return console.error('could not connect to postgresq',err);
       }
       var query = "SELECT fieldName FROM \"Users\" where username='" + username + "';"
       client.query(query, function(err, result) {
            if (err) {
                return console.err("could not complete query", err);
            } 
            client.end();
            console.log(result.rows[0].fieldName);
    
       });
    })
    

    【讨论】:

      【解决方案2】:

      我的网站遇到了同样的问题,更令人沮丧的是它在已部署的网站上运行,但是当我尝试在本地运行该网站(使用工头)时,我收到了这个错误。 从错误中我了解到我无法连接到数据库并进一步检查这些是导致此错误的两个原因:

      1. 没有 DATABASE_URL 环境变量
        出于某种原因,我的 .env 文件中没有设置 process.env.DATABASE_URL,尽管它在远程站点上已正确设置。要解决此问题,您可以运行“heroku config”并将所需的 DATABASE_URL 复制到本地 .env 文件(如果此文件不存在,请创建一个)。
        重要提示:当您复制粘贴变量时,将“:”字符更改为“=”。

      2. ?ssl=true 不是 DATABASE_URL 的一部分
        由于上述修复,客户端现在知道在哪里连接,但由于身份验证问题它仍然无法打开连接。通过将 ?ssl=true 添加到 DATABASE_URL,它终于为我解决了这个问题。似乎当您尝试从远程站点(heroku 服务器)连接时,您不需要传递参数,但是当您尝试从本地计算机连接到数据库时,您需要此身份验证才能进行正确的连接。

      希望它会有所帮助。

      【讨论】:

      • 将 DATABASE_URL=postgres://xxx?ssl=true 添加到 .env 完成了这项工作!谢谢
      • heroku 配置显示了 DATABASE_URL,但在 .env 文件中它不存在...在将其添加到 .env 文件并附加 ?ssl=true 后一切正常:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-13
      • 2014-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多