TypeError:当使用Heroku node.js调用pg.connect时,无法调用null的方法'query'

Por*_*ear 10 postgresql heroku node.js

我遇到一个问题,通过Node.js连接到Heroku postgres数据库.我找到了另一个遇到此问题的人的例子,但他们的建议在我的案例中不起作用.

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

尝试连接的代码是:

pg.connect(DB_URL, function(err, client) {
    client.query( ... )
Run Code Online (Sandbox Code Playgroud)

当领班工作时:

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

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

建议赞赏,我在Heroku文档和Googled-a-lots周围看起来高低无济于事.

Mik*_*keL 29

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

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

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

希望它会有所帮助.

  • 向.env添加DATABASE_URL = postgres:// xxx?ssl = true完成了这项工作!日Thnx (8认同)

小智 2

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

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);

   });
})
Run Code Online (Sandbox Code Playgroud)