Я пытался удаленно подключиться к базе данных 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 на моей лазурной БД.
Я использую 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
Хотя я думаю, что я перечислил выше, это проблема, вот некоторые другие вещи, которые можно попробовать:
user_defined_server_name.postgres.database.azure.com
. Имя моего администратора:user_defined_admin_name@user_defined_server_name
. Они оба были определены при создании сервера базы данных. Вы можете найти их, зайдя на портал Azure и выбрав сервер базы данных. Это будет в верхней части на вкладке Обзор под Essentials.