gpt4 book ai didi

node.js - node-mysql2、AWS.RDS.signer 和连接池

转载 作者:太空宇宙 更新时间:2023-11-03 23:54:13 25 4
gpt4 key购买 nike

我正在使用node-mysql2 库与 AWS.RDS.signer 结合使用.

我有以下函数,它创建一个连接池以重用连接:

const createPool = () => new Promise((resolve, reject) => {
signer.getAuthToken({
region: '...',
hostname: '...',
port: '...',
username: '...'
}, (err, token) => {
if (err) reject(err)
const pool = mysql.createPool({
host: '...',
port: '...',
user: '...',
database: '...',
password: token,
ssl: 'Amazon RDS'
authSwitchHandler: (data, cb) => {
if (data.pluginName === 'mysql_clear_password') cb(null, Buffer.from(token + '\0'))
}
})
resolve(pool)
})
})

暂时效果很好。然后我突然开始收到此错误:

Error: Access denied for user '...'@'...' (using password: YES)

因此,我认为正在发生的情况是,aws 签名者返回的 token 仅在短时间内有效,并且不能用于在池中持续重新建立连接。

据我所知,无法使用 aws sdk 配置 rds token 的 ttl。因此,我能想到的唯一其他选择是完全结束并以某个固定时间间隔重新创建池。

我想知道是否有人遇到过这个问题,并且谁可能对解决这个问题的最佳方法有一些见解?有没有更好的方法将rds签名者与连接池结合使用?

最佳答案

对于node-mysql2版本>=2.0.0

mysql.createPool({
...,
ssl: 'Amazon RDS',
authPlugins: {
mysql_clear_password: () => () =>
signer.getAuthToken({
region: '...',
hostname: '...',
port: '...',
username: '...'
})
}
});

对于node-mysql2版本<2.0.0

mysql.createPool({
...,
ssl: 'Amazon RDS',
authSwitchHandler: (data, cb) => {
if (data.pluginName === 'mysql_clear_password') {
signer.getAuthToken({
region: '...',
hostname: '...',
port: '...',
username: '...'
},
(err, token) => {
if (err) {
cb(err);
} else {
cb(null, Buffer.from(token + '\0'));
}
}
);
} else {
cb(new Error(`Authentication method ${data.pluginName} is not supported`));
}
}
});

另请参阅https://github.com/sidorares/node-mysql2/issues/1017

关于node.js - node-mysql2、AWS.RDS.signer 和连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58067254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com