使用Knex.js和Objection.js连接到Azure Postgres数据库

时间:2018-10-31 04:08:38

标签: javascript node.js azure azure-sql-database knex.js

我一直在尝试使用节点API远程连接到我的azure postgres数据库。我正在使用最新版本的node,objection.js,knex.js和pg。

我的主机地址是(databasePath):

matplotlib

我已经设置了一个包装器来帮助进行SQL连接。我的连接参数在.env文件中定义。每当我尝试使用配置进行连接时,都会出现以下异常:

@import "~angular/material/prebuilt-themes/deeppurple-amber.css"; body { padding: 0; margin: 0; }

如果我尝试使用连接字符串,则DNS无法解析提供的地址。我尝试了两种连接字符串的单独变体形式:

project-name.database.windows.net

Unhandled rejection error: Invalid Username specified. Please check the Username and retry connection. The Username should be in <username@hostname> format. at Connection.parseE (/Users/Eddie/projects/Giggle-Node/node_modules/pg/lib/connection.js:554:11) at Connection.parseMessage (/Users/Eddie/projects/Giggle-Node/node_modules/pg/lib/connection.js:379:19) at TLSSocket.<anonymous> (/Users/Eddie/projects/Giggle-Node/node_modules/pg/lib/connection.js:119:22) at emitOne (events.js:96:13) at TLSSocket.emit (events.js:188:7) at readableAddChunk (_stream_readable.js:176:18) at TLSSocket.Readable.push (_stream_readable.js:134:10) at TLSWrap.onread (net.js:547:20)

例外是:

postgres://userName@myHost:passWord@myHost.postgres.database.azure.com:5432/dbName?ssl=true

我的包装器如下

postgres://userName:passWord@myHost.postgres.database.azure.com:5432/dbName?ssl=true

我的配置或连接字符串是否有问题? 我还在azure数据库上为当前的IPv4添加了防火墙例外。

1 个答案:

答案 0 :(得分:0)

几年来我一直在使用Objection和Knex,但我从未见过围绕它们作为类的类包装器。但是,在接受它的实际价值后,我相信您的问题在于连接字符串。您不能将连接字符串用于Azure Postgres服务,因为默认和必需的Azure Postgres用户名使用@在创建用户名后指定主机。因此,连接字符串将不起作用,因为应该将@从主机名中分离出用户名,并且由于用户名是在用户名中使用的,因此它将断开连接字符串,这似乎是用户名的来源。您的错误信息。我不认为有办法解决这个问题。我在下面举一个例子。注意多余的@,它会抛出连接字符串。我建议遵循此here的knex文档。

Azure Postgres用户名是:user_defined_user_name@user_defined_azure_postgres_database_service_name

您的连接字符串如下所示:postgres://user_defined_user_name@user_defined_azure_postgres_database_service_name@myHost:passWord@myHost.postgres.database.azure.com:5432/dbName?ssl=true

虽然我认为上面列出的是问题所在,但您可以尝试以下其他操作:

  • 如果不是这种情况,您的环境变量是否可能正常工作?您有控制台登录过它们吗?
  • 您是否直接从Azure门户复制了用户名和数据库URL,以确保两端没有多余的空白?
  • 您是否已设置防火墙规则以启用所有IP(出于测试目的,以验证防火墙不是问题)?