TypeError: не может вызывать метод 'query' из null - при вызове pg.connect с Heroku node.js

Я столкнулся с проблемой подключения к базе данных postgres Heroku через Node.js. Я нашел еще один экземпляр того, кто сталкивается с этой проблемой, но их предложение не работает в моем случае.

Я определяю var DB_URL как полный URL-адрес базы данных Postgres, который хранится Heroku. Я делаю это, потому что 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 и Googled-a-much, но безрезультатно.

Ответ 1

У меня была такая же проблема с моим сайтом, и что было более неприятно, так это то, что он работал на развернутом сайте, но когда я пытался запустить сайт локально (используя мастера), я получил эту ошибку. Из-за ошибки я понял, что я не могу подключиться к базе данных, и от дальнейшей проверки это две причины, вызвавшие эту ошибку:

  • Нет переменной среды DATABASE_URL
    По какой-то причине у меня не было параметра process.env.DATABASE_URL, установленного в моем .ENV файле, хотя он был правильно установлен на удаленном сайте. Чтобы решить эту проблему, вы можете запустить "конфигурацию героя" и скопировать требуемый файл DATABASE_URL в локальный файл .env(если этот файл не существует, создайте его).
    Важное примечание: При копировании пасты переменные меняют значение:: char на" =".

  • ? ssl = true не является частью DATABASE_URL
    Благодаря вышеуказанному исправлению клиент теперь знает, куда подключиться, но он все равно не может открыть соединение из-за проблем с аутентификацией. Добавив ? Ssl = true в DATABASE_URL, он, наконец, решил проблему для меня. Похоже, что когда вы пытаетесь подключиться с удаленного сайта (серверы heroku), вам не нужно передавать параметр, но когда вы пытаетесь подключиться к базе данных с вашего локального компьютера, вам нужна эта аутентификация для правильного подключения.

Надеюсь, это поможет.

Ответ 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);

   });
})