Postgres,Docker和Node.js – 密码身份validation失败(连接被拒绝或psql:FATAL:angular色“root”不存在)

我只是不知道为什么我不能使用Node.jslogin到Postgres

user: postgres password: postgres host: 192.168.99.100 port: 5432 database: test_db 

以下是导致错误的Node.js中的几行代码

error: password authentication failed for user "postgres"

 var pg = require('pg'); var conString = "postgres://postgres:postgres@192.168.99.100:5432/test_db"; var client = new pg.Client(conString); client.connect(); 

我从Docker容器运行Postgres。

我启动了另一个容器,并可以使用以下命令成功访问数据库

 psql -U postgres -d test_db -h 192.168.99.100 -W 

此外我可以使用pgAdmin 4成功login

的pg_hba.conf

  # TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only local all all trust # IPv4 local connections: host all all 127.0.0.1/32 trust # IPv6 local connections: host all all ::1/128 trust # Allow replication connections from localhost, by a user with the # replication privilege. #local replication postgres trust #host replication postgres 127.0.0.1/32 trust #host replication postgres ::1/128 trust host all all all md5 

postgresql.conf中

  #------------------------------------------------------------------------------ # CONNECTIONS AND AUTHENTICATION #------------------------------------------------------------------------------ # - Connection Settings - listen_addresses = '*' # comma-separated list of addresses; # defaults to 'localhost'; use '*' for all # (change requires restart) #port = 5432 # (change requires restart) max_connections = 100 # (change requires restart) #superuser_reserved_connections = 3 # (change requires restart) #unix_socket_directories = '/var/run/postgresql' # comma-separated list of directories # (change requires restart) #unix_socket_group = '' # (change requires restart) #unix_socket_permissions = 0777 # begin with 0 to use octal notation # (change requires restart) #bonjour = off # advertise server via Bonjour # (change requires restart) #bonjour_name = '' # defaults to the computer name # (change requires restart) # - Security and Authentication - #authentication_timeout = 1min # 1s-600s #ssl = off # (change requires restart) #ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed SSL ciphers # (change requires restart) #ssl_prefer_server_ciphers = on # (change requires restart) #ssl_ecdh_curve = 'prime256v1' # (change requires restart) #ssl_cert_file = 'server.crt' # (change requires restart) #ssl_key_file = 'server.key' # (change requires restart) #ssl_ca_file = '' # (change requires restart) #ssl_crl_file = '' # (change requires restart) #password_encryption = on #db_user_namespace = off #row_security = on # GSSAPI using Kerberos #krb_server_keyfile = '' #krb_caseins_users = off # - TCP Keepalives - # see "man 7 tcp" for details #tcp_keepalives_idle = 0 # TCP_KEEPIDLE, in seconds; # 0 selects the system default #tcp_keepalives_interval = 0 # TCP_KEEPINTVL, in seconds; # 0 selects the system default #tcp_keepalives_count = 0 # TCP_KEEPCNT; # 0 selects the system default 

任何帮助表示赞赏…

以上都没有帮助通过Node.js应用程序连接到数据库

经过数小时的试验和错误,我决定在我的MAC上安装一个Postgres实例。 在安装Postgres使用操作系统login凭证 (在这种情况下,我的MAClogin凭据)。 我能用我的Node.js应用程序login到Postgres数据库。

然后我想也许这就是所有这些导致连接问题 – 操作系统用户名。 标准的Postgres Docker镜像具有标准的用户名。 切换到后,我可以login没有问题。

这里重现步骤:

  1. 获得标准的Postgres Docker镜像

     docker pull postgres 
  2. 使用以下环境variables启动Docker容器:

     docker run --name pg -p 5432:5432 -e POSTGRES_PASSWORD=passwrd -e POSTGRES_USER=root -e POSTGRES_DB=dse -d postgres 
  3. 启动命令行界面并testing连接。 这使用泊坞窗主机的IP。 获取IP使用docker-machine ip 。 密码是passwrd

     docker exec -ti pg /bin/bash psql -U root -d dse -h 192.168.99.100 -W Password for user root: psql (9.6.2) Type "help" for help. dse=# 

注意:这也将防止类似这样的错误: psql: FATAL: role "root" does not exist

  1. 使用以下内容创build一个Node.js应用程序和一个名为connect.js的文件:

     var pg = require('pg'); var conString = "postgres://root:passwrd@192.168.99.100/dse"; var client = new pg.Client(conString); client.connect(); console.log(client.connectionParameters); process.exit(1); 
  2. 运行应用程序

     node connect.js 

PS:我没有编辑这些文件pg_hba.confpostgresql.conf

我希望能够帮助他人解决同样的问题。

问题出在pg_hba.conf文件中:

 host all all all md5 

在第三列(地址)你应该指定一个域名或networking掩码。 您不能使用all关键字,因为它被视为域名,因此不起作用。

要允许所有连接:

 host all all 0.0.0.0/0 md5 

或者允许一些特定的networking:

 host all all 192.168.0.0/16 md5 

不要忘记重新加载configuration,以便更改生效( service postgresql reload/etc/init.d/postgresql reload

根据您的Docker networking设置 (或者您的Node.js应用程序是否位于同一子网内的不同主机上),您应该相应地修改您的pg_hba.conf以进行客户端连接。 而且由于你的PostgreSQL用户至less为远程连接设置了密码authentication,所以我build议你使用md5作为authentication方法。

如果Docker处于默认bridge设置,则子网通常为172.17.0.0/16(在Ubuntu上):

 host all all 172.17.0.0/16 md5 

如果Docker处于hostnetworking设置,子网可能是192.168.99.0/24:

 host all all 192.168.99.0/24 md5 

打开所有远程主机(注意安全隐患):

 host all all 0.0.0.0/0 md5