异步加载 Sequelize CLI 的配置

问题描述 投票:0回答:1

我正在使用 Sequelize CLI 对数据库运行迁移,并且我有以下

.sequelizerc
文件

// .sequelizerc
const path = require('path');

module.exports = {
  "config": path.resolve('src', 'database', 'config.js'),
  "models-path": path.resolve('src', 'models'),
  "seeders-path": path.resolve('src', 'database', 'seeders'),
  "migrations-path": path.resolve('src',  'database', 'migrations'),
};

我们数据库的凭据保存在机密管理器中,因此可以轻松轮换它们,并且永远不会存储在我们的存储库或某人的计算机中。因此,我们的

config.js
文件看起来像:

// src/database/config.js
const { AsyncObtainDBCredentials } = require("../utilities");
async function setupDBCreds() {
  const dbConfig = await AsyncObtainDBCredentials();
  return dbConfig;
}
module.export = setupDBCreds(); // exports a promise and does not work

Sequelize CLI 需要类似的配置 JSON

const dotenv = require('dotenv')
dotenv.config()

const dbConfig = {
    host: process.env.DB_HOST ?? 'localhost',
    username: process.env.DB_USER ?? 'postgres',
    port: process.env.DB_PORT ?? '5432',
    database: process.env.DB_NAME ?? 'myDBName',
    password: process.env.DB_PASSWORD ?? 'SuperSecretPasswd',
    dialect: "postgres"
};

module.exports = dbConfig;

有没有办法完成这项工作,这样我们就可以避免用户将凭据写入

.env
文件?

javascript asynchronous sequelize.js sequelize-cli
1个回答
0
投票

这是一个老问题,但我在尝试弄清楚如何从 Secret Manager 中提取连接信息时遇到了这个问题。我通过做这样的事情让它工作:

const getSettings = async() => {
  const client = new SecretsManagerClient({
    region: AWS_REGION
  });

  const response = await client.send(
    new GetSecretValueCommand({
      SecretId: AWS_SECRET
    }),
  );
  const settings = JSON.parse(response.SecretString);

  return {
    username: settings.DATABASE_USERNAME,
    password: settings.DATABASE_PASSWORD,
    database: settings.DATABASE_NAME,
    host: settings.DATABASE_HOST,
    port: settings.DATABASE_PORT,
    dialect: 'postgres',
  };
};

module.exports = async() => ({
  development: {
    // local settings
  },
  production: await getSettings(),
});

关键是您可以在

async()
中使用
module.exports

© www.soinside.com 2019 - 2024. All rights reserved.