尝试从节点应用程序连接时出现 PostgreSQL 错误

Posted

技术标签:

【中文标题】尝试从节点应用程序连接时出现 PostgreSQL 错误【英文标题】:PostgreSQL error when trying to connect from node application 【发布时间】:2018-12-30 13:23:01 【问题描述】:
FATAL: no PostgreSQL user name specified in startup packet

通过执行以下操作尝试连接到我的 kubernetes 集群中的 postgreSQL 实例时的日志:

const  POSTGRES_DATABASE, POSTGRES_USERNAME, POSTGRES_PASSWORD  = require('../config/config');

const Sequelize = require('sequelize');
    const conn = new Sequelize(POSTGRES_DATABASE, 
        username: POSTGRES_USERNAME,
        password: POSTGRES_PASSWORD
    );

config/config.js

    const config = 
        POSTGRES_DATABASE: 'postgres://postgres/postgresdb',
        POSTGRES_USERNAME: 'postgresadmin',
        POSTGRES_PASSWORD: 'admin123',
        SERVER_PORT: '5000'
    

module.exports = config;

我在 nodeJS 中使用 SequelizeJS。 http://docs.sequelizejs.com/

由于在 postgreSQL 日志中看到尝试,请求似乎连接正常。但是出了点问题,我想知道 postgres 或节点服务中的权限是否有问题。

感谢一些帮助或想法

【问题讨论】:

POSTGRES_USERNAME 是一个变量吗?它是在哪里定义的? 我更新了第一篇@doublesharp 您正在传递用户名作为密码 - password: POSTGRES_USERNAME 另外,您使用的数据库与配置中的不同。这似乎很奇怪。 我想我的意思是,要么使用 config.js 中的那个,要么从 config.js 中删除它。将其添加到 config.js 中而不使用它会令人困惑,并且会在以后导致更多的混乱。 【参考方案1】:

根据您链接的 Sequelize 文档,创建新连接的参数是 db、用户名、密码。你的代码做了 db,然后是一个带有用户名和密码键的对象。此对象不正确,导致它找不到用户名或密码。试试这个:

const  POSTGRES_DATABASE, POSTGRES_USERNAME, POSTGRES_PASSWORD  = require('../config/config');

const Sequelize = require('sequelize');
const conn = new Sequelize(POSTGRES_DATABASE, POSTGRES_USERNAME, POSTGRES_PASSWORD);

Sequelize 是否 允许一个可选的选项对象作为最后一个参数,但用户名和密码不应该在其中。

文档的这一页让我感到困惑。

http://docs.sequelizejs.com/manual/installation/usage.html

我相信它所说的是您要么需要定义对象中的所有内容,要么将数据库、用户名和密码作为单独的参数,但我没有看到它在参数和用户名/密码中支持数据库物体。

这似乎也应该起作用:

const conn = new Sequelize(
  database: POSTGRES_DATABASE,
  username: POSTGRES_USERNAME,
  password: POSTGRES_PASSWORD
);

【讨论】:

谢谢哥们,很好的收获。现在我得到错误:连接 ECONNREFUSED 127.0.0.1:5432 它不是我想要连接的本地主机,所以我想我需要在 POSTGRES_DATABASE 中定义数据库名称,然后在选项对象中的某处设置一个主机跨度> 你需要在options对象中添加host 我现在意识到我的最后一条评论是连在一起的。 “主机”键是您需要指定的,它知道数据库的 IP 地址或域。看起来您还想将方言设置为“postgres”。我不确定 Sequelize 是否知道 Postgres 默认在端口 5432 上运行。您可能还需要将其指定为“端口”选项。 我目前正在做方言:'postgres',主机:'postgres',但似乎它现在根本没有到达 postgres 服务。它说端口是基于方言的,所以不需要。 // 自定义端口;默认:方言默认 节点是否直接在您的计算机上运行?如果您在 Docker 容器或虚拟机中运行它,您可能会遇到 DNS 未从您的计算机共享到 VM 的问题。

以上是关于尝试从节点应用程序连接时出现 PostgreSQL 错误的主要内容,如果未能解决你的问题,请参考以下文章

通过 JDBC 从 Spark 提取表数据时出现 PostgreSQL 错误

42501:在 Postgresql 中查询时出现特权不足错误

尝试迁移 postgreSQL 时出现或接近“WITH ORDINALITY”错误的语法错误

尝试从 Visual c# 程序更新 oracle 时出现“无效操作。连接已关闭”错误

为啥在尝试从节点脚本部署以太坊智能合约时出现“无效发件人”(-32000)?

尝试插入长数组时出现 Postgresql 错误