2017-08-14 223 views
0

我试图使用mysql_clear_password插件连接到MySQL服务器。我建立连接配置node-mysql2如下:使用knex时出现“mysql_clear_password”插件错误,但使用mysql2时出现错误

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

然后以支持mysql_clear_password插件我添加下述(i所使用的参考的链接:https://github.com/sidorares/node-mysql2/issues/438#issuecomment-255343793):

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 
}; 

我通过在作为值用于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/)它说:根据我以为它只是通过传递配置,并使用node-mysql2连接

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

。任何帮助,将不胜感激。

回答

1

我明白了这个问题,它现在可行。 Knex没有将所有属性传递给msyql2客户端。

以下是我为可能遇到此问题的其他人所做的工作。我修改了knex在node_modules/knex/lib/dialect/mysql2中传递给mysql2的配置,并将authSwitchHandler添加到了configOptions数组中。

+0

这已经固定在master(下一个版本将是0.14),但我不记得它是否已经发布。你正在使用哪个版本? –