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