【问题标题】:Connect to Azure Postgres database using Knex.js and Objection.js使用 Knex.js 和 Objection.js 连接到 Azure Postgres 数据库
【发布时间】:2018-11-02 00:37:30
【问题描述】:

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

我的主机地址是(databasePath):

project-name.database.windows.net

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

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)

如果我尝试使用连接字符串,DNS 将无法解析提供的地址。我尝试了两种不同形式的连接字符串:

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

例外是:

Unhandled rejection Error: getaddrinfo ENOTFOUND at errnoException (dns.js:28:10) at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:76:26)

我的包装如下

const { Model } = require( "objection" );
const Knex = require( "knex" );
const dotenv = require( "dotenv" );

dotenv.config();
class ObjectionSQLHelper
{
    constructor()
    {
        this.SQLDatabaseType = process.env.SQL_VARIANT;
        this.databasePath = process.env.DB_PATH;
        this.dataBaseName = process.env.DB_NAME;
        this.databasePort = process.env.DB_PORT;
        this.databaseUserName = process.env.DB_USER_NAME;
        this.databasePassword = process.env.DB_PASSWORD;

    }

    get connectionSchema()
    {
        const knexSchema =
        {
            client: this.SQLDatabaseType,
            connection: {
                //connectionString: this.connectionString,
                userName: this.databaseUserName,
                passWord: this.databasePassword,
                server: this.databasePath,
                host: this.databasePath,
                options:
                {
                    database: this.dataBaseName,
                    encrypt: true,
                    port: this.dataBasePort,
                    ssl: true
                }
            },
            debug: true
        }
        
        return knexSchema;
    }

    get connectionString()
    {
        return `postgres://${ this.databaseUserName }:${ this.databasePassword }@${ this.databasePath }.postgres.database.azure.com:5432/${ this.dataBaseName }?ssl=true`
    }

    connect()
    {
        this.knexConnection = Knex( this.connectionSchema );
        Model.knex( this.knexConnection );
    }
}

const objectionHelperSinglton = new ObjectionSQLHelper();
objectionHelperSinglton.connect();

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

【问题讨论】:

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


    【解决方案1】:

    我已经使用 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(用于测试目的以验证防火墙不是问题)?

    【讨论】:

    • 我已经在控制台记录了所有内容,并且我的环境变量工作正常。当我可以访问我的机器时,我会尝试这种方法。你能澄清一下 user_defined_azure_postgres_database_service_name 应该是什么吗?
    • 我的服务器网址是user_defined_server_name.postgres.database.azure.com。我的管理员用户名为user_defined_admin_name@user_defined_server_name。这些都是在您创建数据库服务器时定义的。您可以通过转到 Azure 门户并选择您的数据库服务器来找到它们。它将位于 Essentials 下“概览”选项卡的顶部。
    猜你喜欢
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 2018-08-09
    相关资源
    最近更新 更多