【问题标题】:Node.js, PostgreSQL error: no pg_hba.conf entry for hostNode.js、PostgreSQL 错误:主机没有 pg_hba.conf 条目
【发布时间】:2014-09-19 22:22:21
【问题描述】:

我正在关注这篇文章 ((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' 语法有什么错误吗?

【问题讨论】:

  • 您需要编辑 /etc/postgresql/X.Y/main/pg_hba.conf。您需要添加如下所示的一行:“host mydatabase myuser 0.0.0.0/0 md5”。 @Rhim 为您提供了包含该文件完整文档的链接,因此您应该首先参考。
  • @aembke 谢谢你的回答。 /etc/ 目录在哪里?
  • 它在根目录中,假设你在 linux 上运行。
  • 哦,你是说你把它部署到heroku,你看到了这个错误?或者你试图在你自己的盒子上运行它?如果您在 heroku 上执行此操作,您可能需要首先配置您的数据库。首先,您应该阅读本指南:devcenter.heroku.com/articles/…。然后,您需要修改代码以使用 heroku 的环境变量进行连接:devcenter.heroku.com/articles/…。如果您遵循他们的指南,他们应该为您处理 pg_hba.conf 修改。

标签: node.js postgresql express heroku


【解决方案1】:

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

【讨论】:

  • 这是您的应用程序代码错误。我会就该问题提出一个新问题,它与原始问题完全无关。您也应该在新问题中发布所有应用程序代码。
【解决方案2】:

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

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

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

【讨论】:

【解决方案3】:

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

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

Heroku 提供了一些关于如何连接到它的附加数据库的非常好的支持;然而,不幸的是,它没有提及(或者我错过了)任何关于执行 SSL 的内容,因为从 Standard-0 开始的所有 Heroku dB 层默认都强制执行 SSL。

【讨论】:

  • 谢谢 - 已升级到 Standard-0 并且没有看到这会改变 SSL 要求的警告,这引起了轻微的恐慌。
  • Heroku 最近发送了一条警告,说它将强制使用 SSL。它们包括与上面发布的类似的文档。我按照这些说明进行操作,但由于 SSL 问题,我的应用程序今天刚刚崩溃。我添加了 PGSSLMODE 配置变量,一切都恢复正常。谢谢!
【解决方案4】:

在 Heroku 上运行:

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

初始化 new 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
  }
}

【讨论】:

  • 使用options: { dialect:'postgres', native:true, ssl:true, dialectOptions: {ssl: true}'
  • 我的经验,使用 Hobby 层 Heroku pg:应用程序续集连接在没有 native:true 的情况下工作,添加此选项会破坏它。 Sequelize CLI 在这两种情况下都不起作用。
  • @defraggled 我已经添加了你关于爱好测功机的提示
【解决方案5】:

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

改变

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

【讨论】:

    【解决方案6】:

    对我有用的是上述答案和评论(来自@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 关于 Sequelize 问题,该问题也已添加到文档中。

    【讨论】:

    • 对我来说只需要dialectOptions
    【解决方案7】:

    设置 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();
    

    【讨论】:

      【解决方案8】:

      ?ssl=true 添加到 uri 的末尾应该可以。

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

      【讨论】:

      【解决方案9】:

      你必须添加

      ssl: true
      

      在json连接中

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

      【讨论】:

        【解决方案10】:
        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 的正确解决方案。 github.com/typeorm/typeorm/issues/278
        • 你拯救了我的一天维克多!
        • 这个解决方案对我有用,使用 Sequelize ORM。你救了我。
        【解决方案11】:
        const Pool = require("pg").Pool;
        
        const proConfig = {
          connectionString: process.env.DATABASE_URL,
          ssl: {
            rejectUnauthorized: false
          }
        }
        
        const pool = new Pool(proConfig);
        
        module.exports = pool;
        

        【讨论】:

          【解决方案12】:

          我一次又一次地面临同样的问题。 包:

          "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
            }
          }
          

          【讨论】:

            【解决方案13】:

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

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

            Heroku guide

            Heroku 在其更新日志here 上宣布了这项 SSL 更改

            【讨论】:

              【解决方案14】:

              只需通过允许和要求 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_TLS_REJECT_UNAUTHORIZED='0' 添加为环境变量,无论您在哪里运行节点或直接使用NODE_TLS_REJECT_UNAUTHORIZED='0' node app.js 运行节点

              【讨论】:

                【解决方案15】:

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

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

                【讨论】:

                • 好主意。我在部署分支的 knex 配置文件中尝试了它,但它不起作用。
                【解决方案16】:

                由于 node-Postgres 默认启用 SSL 验证,而免费的 Heroku 托管不会自动提供它,因此您需要将其关闭。 在 Heroku 中禁用 SSL:

                heroku config:set PGSSLMODE=no-verify --app <app name>
                

                https://dpletzke.medium.com/configuring-free-heroku-node-postgresql-hosting-with-knex-b0e97a05c6af

                https://help.heroku.com/DR0TTWWD/seeing-fatal-no-pg_hba-conf-entry-errors-in-postgres

                【讨论】:

                  【解决方案17】:

                  即使错误相同,我的解决方案也不是这些解决方案,在尝试了上述所有解决方案数天无济于事后,我后来发现我在连接字符串的末尾添加了一个分号 (;),如下所示;

                  DB_URL=pg://admin:guest@localhost:5432/Employees;
                  
                  //instead of
                  
                  DB_URL=pg://admin:guest@localhost:5432/Employees
                  
                  

                  分号在技术上添加了一个不属于配置/身份验证文档的额外字符,因此无法识别。任何人都可以犯的愚蠢且可避免的错误。注意细节

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-08-11
                    • 1970-01-01
                    • 2010-11-27
                    • 2021-06-11
                    • 1970-01-01
                    • 2020-09-15
                    • 2020-09-29
                    相关资源
                    最近更新 更多