2017-04-21 96 views
1

我只是想不出为什么我无法使用登录到Postgres Node.jsPostgres,Docker&Node.js - 密码身份验证失败(连接被拒绝或psql:FATAL:角色“root”不存在)

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:[email protected]:5432/test_db"; 

var client = new pg.Client(conString); 
client.connect(); 

我跑Postgr es来自Docker容器。

我解雇了另一个容器中,可以使用下面的命令

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

而且我可以用成功登录成功访问DB pgAdmin 4

的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 

任何帮助表示赞赏...

+0

确保您的密码很简单。例如,不能有任何哈希标签,因为驱动程序不支持它;) –

回答

2

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

经过数小时的试验和错误,我决定在我的MAC上安装一个Postgres实例。在安装时,Postgres使用了操作系统的登录凭证(在本例中为我的MAC登录凭证)。我可以用我的Node.js应用程序登录到Postgres数据库。

然后我想也许这就是它导致连接问题 - 操作系统用户名。标准Postgres Docker镜像具有作为标准用户名。切换到我能够登录没有问题。重现

下面的步骤:

  1. 得到标准的Postgres泊坞窗图像

    docker pull postgres 
    
  2. 启动泊坞容器以下环境变量:

    docker run --name pg -p 5432:5432 -e POSTGRES_PASSWORD=passwrd -e POSTGRES_USER=root -e POSTGRES_DB=dse -d postgres 
    
  3. 开始命令行界面和测试连接。这使用泊坞窗主机的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

  • 创建的Node.js应用程序和一个文件名为connect.js,内容如下:

    var pg = require('pg'); 
    
    var conString = "postgres://root:[email protected]/dse"; 
    var client = new pg.Client(conString); 
    client.connect(); 
    console.log(client.connectionParameters); 
    process.exit(1); 
    
  • Run th Ë应用

    node connect.js 
    
  • PS:我没有修改这两个文件都不pg_hba.confpostgresql.conf的。

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

    0

    的问题是在pg_hba.conf文件:

    host all all all md5 
    

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

    要允许所有连接:

    host all all 0.0.0.0/0 md5 
    

    ,或者允许一些特定的网络:

    host all all 192.168.0.0/16 md5 
    

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

    0

    根据您的Docker network settings(或者您的Node.js应用程序位于同一子网内的其他主机上),则应相应地修改您的pg_hba.conf以获取客户端连接。由于您的PostgreSQL用户至少为远程连接设置了密码验证,因此我建议您使用md5作为验证方法。

    如果码头工人在默认bridge网络设置,子网通常是172.17.0.0/16(在Ubuntu):

    host all    all    172.17.0.0/16   md5 
    

    如果码头工人在host网络设置,子网可能是192.168.99。0/24:

    host all    all    192.168.99.0/24   md5 
    

    要打开所有的远程主机(是提醒注意安全的启示):

    host all    all    0.0.0.0/0    md5 
    
    +0

    我做了更改并重新启动服务器 - 仍然没有运气。我可以启动另一个容器,并使用正在运行的容器'docker run -it -rm test_db psql -U postgres -h 172.17.0.2'的IP,它工作正常。同时,我在我的MAC上本地安装了一个postgres实例。由于它与我的电脑登录名和密码一起安装,因此我可以连接到节点。它必须与权限有关。 –

    +0

    因为你的节点。js以明文形式发送验证数据,请尝试将auth方法从'md5'切换到'pg_hba'中的'password',重新启动PostgreSQL并查看是否有效。 –