You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js/Lambda通过AWS Secrets Manager连接MySQL时账号密码未解析

解决AWS Secrets Manager获取的Secret值无法解析为MySQL连接参数的问题

问题核心:你从Secrets Manager获取到的secret_value是JSON格式的字符串,而非JavaScript对象,直接通过.访问属性自然会返回undefined。

快速修复方案

在connect函数中,将获取到的Secret字符串解析为JavaScript对象即可:

修改连接代码中的这一行:

const secret_value = await SecretsManager.getSecret(secretName);

替换为:

const secret_value = JSON.parse(await SecretsManager.getSecret(secretName));

完整修改后的connect函数代码:

const mysql = require('mysql2/promise');
const SecretsManager = require('./secret')

async function connect() {
    const secretName = process.env.SECRET_NAME
    // 关键:将JSON字符串解析为JS对象
    const secret_value = JSON.parse(await SecretsManager.getSecret(secretName));

    try {
        const config = {
                host: process.env.DB_HOST,
                port: '3306',
                user: secret_value.username,
                password: secret_value.password,
                database: process.env.DB_NAME
            }
        console.log(config)
        const connection = await mysql.createConnection(config);
        return connection
    } catch (err) {
        console.log(`MySQL connection error: ${err}`)
    }
}

module.exports = {
    connect
}

进阶优化方案(推荐)

如果希望getSecret函数直接返回可使用的对象,避免每次调用都手动解析,可以修改getSecret函数中的resolve逻辑,直接解析JSON后返回:

async function getSecret(secretName) {
    var AWS = require('aws-sdk'),
        region = process.env.REGION,
        secretName = secretName;

    var client = new AWS.SecretsManager({
        region: region
    });

    return new Promise((resolve,reject)=>{
        client.getSecretValue({SecretId: secretName}, function(err, data) {
            if (err) {
                reject(err);
            }
            else {
                if ('SecretString' in data) {
                    // 直接解析JSON字符串为对象返回
                    resolve(JSON.parse(data.SecretString));
                } else {
                    let buff = Buffer.from(data.SecretBinary, 'base64');
                    // 若二进制存储的是JSON格式,同样解析后返回
                    resolve(JSON.parse(buff.toString('ascii')));
                }
            }
        });
    });
}

module.exports = {
    getSecret
}

验证方式

修改后可以添加日志验证解析结果:

console.log(typeof secret_value); // 输出应为object
console.log(secret_value.username); // 输出应为实际的数据库用户名

内容的提问来源于stack exchange,提问作者Zalizan Zolkipali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 00:25:19