Подключитесь к базе данных Azure Postgres, используя Knex.js и Objection.js

1

Я пытался удаленно подключиться к базе данных 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:[email protected]:5432/dbName?ssl=true

а также

postgres://userName:[email protected]: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
azure-sql-database
knex.js

1 ответ

0

Я использую 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:[email protected]:5432/dbName?ssl=true

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

  • Если это не так, возможно ли, что переменные среды работают правильно? Вы консолировали их?
  • Скопировали ли вы имя пользователя и URL-адрес базы данных прямо с портала Azure, чтобы не было лишнего пробела на концах?
  • Вы настроили правила брандмауэра, чтобы включить все IP-адреса (для проверки в целях проверки того, что брандмауэр не является проблемой)?
  • 0
    Я все записал в консоль, и мои переменные env работают нормально. Я попробую этот подход, когда у меня будет доступ к моей машине. Можете ли вы уточнить, каким должно быть имя user_defined_azure_postgres_database_service_name?
  • 0
    URL моего сервера - user_defined_server_name.postgres.database.azure.com . Имя моего администратора: user_defined_admin_name@user_defined_server_name . Они оба были определены при создании сервера базы данных. Вы можете найти их, зайдя на портал Azure и выбрав сервер базы данных. Это будет в верхней части на вкладке Обзор под Essentials.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню