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

node-liquibase打印数据库凭据问题及异常捕获需求

解决方案:隐藏数据库凭据并处理Liquibase异常

一、过滤正常运行时的敏感凭据输出

由于node-liquibase开发版会打印包含用户名、密码的完整命令,我们可以通过临时重写console方法,对输出内容进行脱敏处理:

// 保存原始console方法
const originalLog = console.log;
const originalError = console.error;

// 定义脱敏规则:替换敏感信息为***
const sanitizeOutput = (content) => {
  if (typeof content !== 'string') return content;
  // 替换JDBC URL中的密码部分
  content = content.replace(/jdbc:postgresql:\/\/[^:]+:[^@]+@/g, 'jdbc:postgresql://***:***@');
  // 替换命令行中的用户名、密码参数
  content = content.replace(/--username=\S+/g, '--username=***');
  content = content.replace(/--password=\S+/g, '--password=***');
  return content;
};

// 重写console.log和console.error,自动脱敏输出
console.log = (...args) => originalLog.apply(console, args.map(sanitizeOutput));
console.error = (...args) => originalError.apply(console, args.map(sanitizeOutput));

二、错误场景下保留有效错误信息并脱敏

上述脱敏逻辑会自动处理错误输出中的凭据,确保控制台只显示Liquibase的错误详情,不会泄露敏感信息。

三、捕获update异常并区分错误场景

instTs.update()返回Promise,我们可以用async/await配合try/catch捕获异常,并根据错误特征区分场景:

完整修改后的index.js代码

const LiquibaseTS = require('node-liquibase').Liquibase;
const POSTGRESQL_DEFAULT_CONFIG = require('node-liquibase').POSTGRESQL_DEFAULT_CONFIG;

// 1. 初始化脱敏逻辑
const originalLog = console.log;
const originalError = console.error;

const sanitizeOutput = (content) => {
  if (typeof content !== 'string') return content;
  content = content.replace(/jdbc:postgresql:\/\/[^:]+:[^@]+@/g, 'jdbc:postgresql://***:***@');
  content = content.replace(/--username=\S+/g, '--username=***');
  content = content.replace(/--password=\S+/g, '--password=***');
  return content;
};

console.log = (...args) => originalLog.apply(console, args.map(sanitizeOutput));
console.error = (...args) => originalError.apply(console, args.map(sanitizeOutput));

// 2. 配置Liquibase
const myConfig = {
  ...POSTGRESQL_DEFAULT_CONFIG,
  changeLogFile: './changelog.xml',
  url: 'jdbc:postgresql://localhost:5432/node_liquibase_testing',
  username: 'postgres',
  password: 'postgres123',
  logLevel: 'info'
};

const instTs = new LiquibaseTS(myConfig);

// 3. 执行更新并处理异常
(async () => {
  try {
    await instTs.update();
    console.log('Liquibase更新执行成功');
  } catch (error) {
    const errorMsg = sanitizeOutput(error.stderr || error.message);
    
    // 根据错误特征区分场景
    if (errorMsg.includes('relation "') && errorMsg.includes('" does not exist')) {
      console.error('错误:目标表不存在,请检查变更集');
    } else if (errorMsg.includes('permission denied')) {
      console.error('错误:数据库权限不足,请检查用户权限');
    } else if (errorMsg.includes('connection refused')) {
      console.error('错误:数据库连接失败,请检查地址、端口或服务状态');
    } else {
      console.error('Liquibase执行错误:', errorMsg);
    }
    
    // 终止进程(可选,根据业务需求调整)
    process.exit(1);
  } finally {
    // 恢复原始console方法,避免影响其他代码
    console.log = originalLog;
    console.error = originalError;
  }
})();

关键说明

  • 脱敏逻辑通过正则匹配替换敏感内容,可根据实际输出格式调整规则
  • 错误场景区分基于Liquibase输出的特征字符串,可根据业务需要扩展更多判断条件
  • 最后在finally块恢复原始console方法,避免影响其他模块的日志输出

内容的提问来源于stack exchange,提问作者Vasudevan Sivalingam Pillai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 05:50:11