Ошибка плагина "mysql_clear_password" при использовании knex, но не при использовании mysql2

Я пытаюсь подключиться к серверу MySQL, используя mysql_clear_password плагин. Я настроил конфигурацию соединения для node-mysql2 следующее:

const connectionConfig = {
  host: rwConfig.host,
  user: rwConfig.user,
  database: rwConfig.database,
  ssl: {
    ca: sslContent
  },
  password
}

Затем, чтобы поддержать mysql_clear_password Плагин Я добавил следующее (ссылка на ссылку, которую я использовал: https://github.com/sidorares/node-mysql2/issues/438):

connectionConfig.authSwitchHandler = (data, cb) => {
  console.log('In auth switch handler');
  if (data.pluginName === 'mysql_clear_password') {
    console.log(data);
    console.log(data.pluginData.toString('utf8'));
    console.log('In mysql clear password');
    var tmppassword = connectionConfig.password + '\0';
    var buffer = Buffer.from(tmppassword, 'base64');
    cb(null, buffer);
  }
};

Это работает, когда я пытаюсь подключиться к моей базе данных.

Сейчас я пытаюсь сделать нечто подобное, используя knexjs. Я использую следующий объект конфигурации:

const knexConfig = {
  client: 'mysql2',
  connection: connectionConfig,
  pool: {
    min: 0,
    max: 20
  },
  acquireConnectionTimeout: 10000
};

connectionConfig Я передал в качестве значения для connection это тот же объект, который я использовал для соединения с node-mysql2, Затем я создаю knex соединение:

const rwConnection = knex(knexConfig);

Это по какой-то причине выдает эту ошибку:

{ Error: Client does not support authentication protocol requested by server; consider upgrading MySQL client
at Packet.asError (node_modules/mysql2/lib/packets/packet.js:703:13)
at ClientHandshake.Command.execute (node_modules/mysql2/lib/commands/command.js:28:22)
at Connection.handlePacket (node_modules/mysql2/lib/connection.js:515:28)
at PacketParser.onPacket (node_modules/mysql2/lib/connection.js:94:16)
at PacketParser.executeStart (node_modules/mysql2/lib/packet_parser.js:77:14)
at TLSSocket.<anonymous> (node_modules/mysql2/lib/connection.js:386:31)
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)
code: 'ER_NOT_SUPPORTED_AUTH_MODE',
errno: 1251,
sqlState: '#08004' }

Я не знаю, почему это дает мне ошибку. В документации knex ( http://knexjs.org/) говорится:

The connection options are passed directly to the appropriate database client to create the connection, and may be either an object, or a connection string

Исходя из этого, я думал, что он просто пропустит конфигурацию и установит соединение, используя node-mysql2, Любая помощь будет оценена.

1 ответ

Я разобрался с проблемой, и теперь она работает. Knex не передавал все атрибуты клиенту msyql2.

Вот что я сделал для всех, кто может столкнуться с этой проблемой. Я изменил конфигурации, которые knex передавал mysql2 в node_modules/knex/lib/dialect/mysql2 и добавил authSwitchHandler в массив configOptions.

Другие вопросы по тегам