Подключитесь к базе данных Azure Postgres, используя Knex.js и Objection.js - PullRequest
0 голосов
/ 31 октября 2018

Я пытался подключиться к своей базе данных Azure Postgres удаленно с помощью API узла. Я использую последнюю версию узла, 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();

Есть ли проблема с моей конфигурацией или строкой подключения? Я также добавил исключение брандмауэра для моего текущего IPv4 в моей базе данных Azure.

1 Ответ

0 голосов
/ 01 ноября 2018

Я использую Objection и Knex уже несколько лет, и я никогда не видел оболочку класса вокруг них как синглтон. Однако, принимая это за чистую монету, я думаю, что ваша проблема связана со строкой соединения. Вы не можете использовать строку подключения для службы Azure Postgres, поскольку имя пользователя Azure Postgres по умолчанию и требуемое имя @ используется для указания хоста после вашего имени пользователя, которое вы создали. Таким образом, строка подключения не будет работать, потому что @ должен отделять имя пользователя от хоста, и, поскольку они используют его в имени пользователя, он нарушит строку подключения, которая, по-видимому, является источником вашей ошибки. сообщение. Я не верю, что есть способ обойти это. Я поставил пример ниже. Обратите внимание на дополнительные @, которые отбрасывают строку подключения. Я рекомендовал бы следовать документации 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

Хотя я думаю, что проблема в том, что я перечислил выше, вот еще несколько вещей, которые стоит попробовать:

  • Если это не так, возможно ли, что переменные среды работают правильно? Вы их консоль зарегистрировали?
  • Скопировали ли вы свое имя пользователя и URL базы данных непосредственно с портала Azure, убедившись, что на концах нет лишних пробелов?
  • Установили ли вы правила брандмауэра для включения всех IP-адресов (в целях тестирования, чтобы убедиться, что брандмауэр не является проблемой)?
...