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

73
我正在遵循这篇文章 ((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)

编辑:我进行了更多的研究,并发现 'pg_hba.conf' 文件在我的

/usr/local/var/postgres 

我将这一行添加到'pg_hba.conf'文件中。

# TYPE  DATABASE        USER            ADDRESS                 METHOD
 host   all             all                                     trust

也尝试过

# TYPE  DATABASE        USER            ADDRESS                 METHOD
host   all             all              0.0.0.0/0               md5
但它一直说我的主机、用户、数据库等没有条目...我的'pg_hba.conf'语法有问题吗?

但它一直说我的主机、用户、数据库等没有条目...我的'pg_hba.conf'语法有问题吗?


假设您正在Linux上运行,它位于根目录中。 - aembke
3
你是在说你将这个部署到了Heroku,并看到了这个错误吗?还是你尝试在自己的设备上运行这个?如果你在Heroku上做这件事,你可能需要先准备好你的数据库。首先,你应该按照这个指南操作: https://devcenter.heroku.com/articles/heroku-postgresql#provisioning-the-add-on。然后,你需要修改你的代码,使用Heroku的环境变量连接:https://devcenter.heroku.com/articles/heroku-postgresql#connecting-in-node-js。如果你遵循他们的指南,他们会为你处理pg_hba.conf的修改。 - aembke
仍然是同样的问题,没有改变。 - stcho
当我使用 Heroku 的 Postgres 服务时,我也遇到了这个问题。有关最新答案,请参见 https://github.com/typeorm/typeorm/issues/278 上的最新评论。 - Poulad
显示剩余8条评论
18个回答

95

将您的连接代码更改为使用 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


你的应用程序代码出现了错误。我建议你开一个新问题来解决这个问题,因为它与原来的问题没有任何关系。在新问题中,你应该把所有的应用程序代码都发布出来。 - aembke

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

这是截至 pg 版本 8.5.1 的正确解决方案。 https://github.com/typeorm/typeorm/issues/278 - Poulad
2
你救了我的一天,维克多! - lets0code
1
这个解决方案对我很有效,使用Sequelize ORM。你救了我。 - Sobhani
1
谢谢你,维克多!对我有用!<3 - Uğurcan
1
这对我有用!谢谢!喜欢解释为什么每个选项都是必需的评论。 - Aneesh
1
非常感谢!在花费了几个小时后,这个方法对我起作用了。 - undefined

32

在heroku上运行:

当我们将heroku上的pg数据库从级别升级到时,我们遇到了这个错误。需要SSL,但我们没有在配置文件中设置它。

在初始化新的Sequelize(...)时,在配置文件中加入。

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

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

@Atish提供的信息: 使用

options: { 
  dialect: "postgres",
  native: true, # adding this maybe breaks on hobby dyno
  ssl: true, 
  dialectOptions: {
    ssl: true
  }
}

1
使用选项:{dialect:'postgres',native:true,ssl:true,dialectOptions:{ssl:true}} - Atish
我的经验是,使用Hobby级别的Heroku pg:应用程序sequelize连接可以在没有native:true的情况下正常工作,而添加此选项会导致其出现故障。无论哪种情况下,Sequelize CLI都无法正常工作。 - defraggled
2
@defraggled,我已经采纳了你关于爱好者测功机的提示。 - Simon Franzen

19

如果Sequelize忽略了您打开SSL的所有尝试,您可以尝试说服PG默认为所有连接启用SSL:

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

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

6
另一个选项,在我看来稍微更加干净,是在你的 sequelizeConfig 中执行以下操作:{ "dialect":"postgres", "ssl":true, "dialectOptions":{ "ssl": {"require":true } }}https://github.com/sequelize/cli/issues/154#issuecomment-167960024 - Schybo
1
在我的情况下,这个方法起作用了,但是它揭示了一个进一步的错误,正如这个问题/答案所描述并解决的那样:https://dev59.com/6VMH5IYBdhLWcg3wnASa#61350416 - defraggled

14

在URI的结尾添加?ssl=true应该可以奏效。

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

1
?ssl=true 替换为 ?sslmode=require。以下是两个相关参考链接:1) https://devcenter.heroku.com/articles/heroku-postgresql#heroku-postgres-ssl 2) https://www.postgresql.org/docs/9.1/libpq-ssl.html - Tunji Oyeniran

12
你也可以通过Heroku的Web界面或CLI使用环境配置变量'PGSSLMODE'设置为'require'。
案例:将Postgres dB设置为Heroku附加项并附加到Heroku Dyno上。
Heroku提供了一些非常好的支持,说明如何连接其附加数据库之一。但是,它不幸地省略了(或者,我错过了)如何强制执行SSL的任何提及,因为所有以Standard-0开头的Heroku dB层默认都会强制执行SSL。

2
谢谢 - 我已经升级到标准-0,但没有看到警告会更改SSL要求,这引起了轻微的恐慌。 - Freewalker
1
Heroku最近发布了一条警告,称它将强制使用SSL。他们包括了与上面发布的类似的文档。我遵循了这些说明,但由于SSL问题,我的应用程序今天刚刚崩溃了。我添加了PGSSLMODE配置变量,现在一切都恢复正常了。谢谢! - ricardojr

10

使用带有SSL的DialectOptions可以工作,但您也可以更新配置变量PGSSLMODE。

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

请参阅Heroku指南

Heroku在其更改日志中宣布了此SSL更改,此处可查看。


5

在创建pg客户端时,这个配置对我的问题很有帮助。您也可以在此处阅读该模块网站上编写的详细文档 >>> https://node-postgres.com/features/ssl。谢谢。

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

好主意。我在部署分支的knex配置文件中尝试了一下,但是没有起作用。 - Royer Adames

5
我成功的方法是以上回答和@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 }}

在 Sequelize 问题上评论,该问题也已添加到文档中。


1
对我来说只需要 dialectOptions - d512

4
我一再遇到同样的问题。 这些软件包:
"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
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接