Node.js,PostgreSQL错误:主机没有pg_hba.conf条目

时间:2014-07-28 16:50:11

标签: node.js postgresql express heroku

我正在关注这篇文章((http://nodeexamples.com/2012/09/21/connecting-to-a-postgresql-database-from-node-js-using-the-pg-module/)。我已经将我的应用程序部署到heroku并且目前正在使用express,node.js,尝试连接到我刚安装的Heroku中的PostgresSQL数据库。到文章的最后,我使用命令

node myfile.js

我收到此错误

error: no pg_hba.conf entry for host "...", user "...", database "...", ... 

如何创建一个以及我应用程序目录中的哪个位置?

以下是整个错误消息。我更改了IP地址,用户和数据库的字符串,但它看起来基本上就像它。

events.js:72
    throw er; // Unhandled 'error' event
          ^
error: no pg_hba.conf entry for host "00.000.000.00", user "username", database "databasename", SSL off
at Connection.parseE (/Users/user/workspace/MyApp/app/node_modules/pg/lib/connection.js:526:11)
at Connection.parseMessage (/Users/user/workspace/MyApp/app/node_modules/pg/lib/connection.js:356:17)
at Socket.<anonymous> (/Users/user/workspace/MyApp/app/node_modules/pg/lib/connection.js:105:22)
at Socket.emit (events.js:95:17)
at Socket.<anonymous> (_stream_readable.js:748:14)
at Socket.emit (events.js:92:17)
at emitReadable_ (_stream_readable.js:410:10)
at emitReadable (_stream_readable.js:406:5)
at readableAddChunk (_stream_readable.js:168:9)
at Socket.Readable.push (_stream_readable.js:130:10)

编辑:我做了更多研究,发现&#39; pg_hba.conf&#39;文件在我的

/usr/local/var/postgres 

我将这一行添加到&#39; pg_hba.conf&#39;文件

# TYPE  DATABASE        USER            ADDRESS                 METHOD
 host   all             all                                     trust

也尝试了

# TYPE  DATABASE        USER            ADDRESS                 METHOD
host   all             all              0.0.0.0/0               md5

但它一直说我的主机,用户,数据库等没有条目...... 是我的&#39; pg_hba.conf&#39;语法有什么错误吗?

15 个答案:

答案 0 :(得分:30)

更改连接代码以使用ssl。关注您的链接示例:

var conString = "pg://admin:guest@localhost:5432/Employees";
var client = new pg.Client(conString);
client.connect();

变为:

var client = new pg.Client({
    user: "admin",
    password: "guest",
    database: "Employees",
    port: 5432,
    host: "localhost",
    ssl: true
}); 
client.connect();

https://github.com/brianc/node-postgres/wiki/Client#new-clientobject-config--client

答案 1 :(得分:12)

如果sequelize忽略了你打开ssl的所有努力,你可以尝试说服pg默认为所有conncetions启用ssl:

var pg = require('pg');
pg.defaults.ssl = true;

const Sequelize = require('sequelize');
const sequelize = new Sequelize('postgres://...');

答案 2 :(得分:10)

添加?ssl=true应该可以在uri的末尾工作。

var conString = "pg://admin:guest@localhost:5432/Employees?ssl=true";

答案 3 :(得分:6)

我们在将heroku上的pg数据库从hobby层升级到standard-0时遇到了此错误。 SSL是必需的,但是我们没有在配置中设置它。

初始化新的Sequelize(...)时包含在配置中

"dialect": "postgres",
"dialectOptions": {
  "ssl": true
}

这个技巧是,ssl选项包装在dialectOptions中。 在此处找到:https://github.com/sequelize/sequelize/issues/956#issuecomment-147745033

答案 4 :(得分:6)

DialectOptions with SSL 有效,但您也可以更新配置变量 PGSSLMODE。

<块引用>

或者,您可以省略 ssl 配置对象,如果您 指定 PGSSLMODE 配置变量:heroku config:set PGSSLMODE=no-verify。

Heroku guide

Heroku 在他们的变更日志 here

中宣布了这一 SSL 变更

答案 5 :(得分:5)

您也可以通过Heroku的网络界面或CLI使用ENVIRONMENT CONFIG VARIABLE'PGSSLMODE'来“要求”。

案例:Postgres dB设置为Heroku附加组件并附加到Heroku Dyno上的应用程序。

Heroku为如何连接到其附加数据库提供了一些非常好的支持;然而,遗憾的是,它遗漏了(或者,我错过了)任何关于强制执行SSL的提及,因为默认情况下以Standard-0开头的所有Heroku dB层强制执行SSL。

答案 6 :(得分:3)

const sequelize = new Sequelize({
  database: "DB",
  username: "root",
  password: "pass",
  host: "localhost",
  port: 5432,
  dialect: "postgres",
  dialectOptions: {
    ssl: {
      require: true, // This will help you. But you will see nwe error
      rejectUnauthorized: false // This line will fix new error
    }
  },
});

答案 7 :(得分:2)

我一次又一次地遇到同样的问题。 包:

"pg": "^8.5.1",
"pg-hstore": "^2.3.3",
"sequelize": "^6.5.0",
"sequelize-cli": "^6.2.0"

我通过在 Sequelize 的 config.json 文件中添加以下内容解决了这个问题。

"dialect": "postgres",
"dialectOptions": {
  "ssl": {
    "rejectUnauthorized": false
  }
}

答案 8 :(得分:1)

对我有用的是上述答案和评论(来自@schybo)的组合

let cloud_config = {
  username: process.env.DB_USERNAME,
  database: process.env.DB_DATABASE,
  password: process.env.DB_PASSWORD,
  host: process.env.DB_HOSTNAME,
  port: 5432,
  ssl: true,
  dialect: 'postgres',
  dialectOptions: {
    "ssl": {"require":true }
  }
};

同时使用ssl: true,dialectOptions: { "ssl": {"require":true }}

Comment关于续集的问题,该问题也已添加到文档中。

答案 9 :(得分:0)

只需在客户端初始化中添加一个标志:

更改

const conString = "pg://admin:guest@localhost:5432/Employees"
const client = new pg.Client(conString);
client.connect();

收件人

const conString = "pg://admin:guest@localhost:5432/Employees"
const client = new pg.Client({
  connectionString: process.env.DATABASE_URL,
  ssl: true
});
client.connect();

答案 10 :(得分:0)

设置ssl: true对我有用

let pg = require('pg');

let pgClient = new pg.Client({
    user: "admin",
    password: "guest",
    database: "Employees",
    port: 5432,
    host: "localhost",
    ssl: true
}); 
pgClient.connect();

答案 11 :(得分:0)

您必须添加

ssl: true

在json连接中

    {
        host: 'myHost.com',
        user: 'myUser',     
        password: 'myPassword',
        database: 'myDb',
        port: 5432,
        ssl: true
    }

答案 12 :(得分:0)

const Pool = require("pg").Pool;

const proConfig = {
  connectionString: process.env.DATABASE_URL,
  ssl: {
    rejectUnauthorized: false
  }
}

const pool = new Pool(proConfig);

module.exports = pool;

答案 13 :(得分:0)

只需通过允许和要求 SSL 更新您的 database/config.js 文件

  production: {
    use_env_variable: 'DATABASE_URL',
    dialect: 'postgresql',
    ssl: true,
    dialectOptions: {
      ssl: { require: true },
    },
    logging: false,
  },

之后可能会遇到另一个问题:nodejs - error self-signed certificate in 如果是这种情况,请在运行 node 或直接使用 NODE_TLS_REJECT_UNAUTHORIZED='0' node app.js

运行 node 的任何位置添加 NODE_TLS_REJECT_UNAUTHORIZED='0' 作为环境变量

答案 14 :(得分:0)

在创建 pg 客户端时,这个配置为我解决了这个问题。您还可以在此处阅读模块网站上的详细文档 >>> https://node-postgres.com/features/ssl。谢谢。

new pg.client({
  connectionString,
  ssl: {
    rejectUnauthorized: false,
  },
})