nodejs sequelize连接字符串中的异步等待问题

Posted

技术标签:

【中文标题】nodejs sequelize连接字符串中的异步等待问题【英文标题】:Async await problem in nodejs sequelize connection string 【发布时间】:2022-01-14 07:39:03 【问题描述】:

function credential(secretFromVault) 
  const creddetails = new ClientSecretCredential(clientId, tenantId, cleintSecret);
  // Build the URL to reach your key vault
  const url = `https://<vaultName>.vault.azure.net/`;

  // Lastly, create our secrets client and connect to the service
  const client = new SecretClient(url, creddetails);

  const secretName = secretFromVault;
  return new Promise(resolve => 
    client.getSecret(secretName).then(latestSecret => 
      console.log(`value from secret is`, latestSecret.value);
      resolve(latestSecret.value)
    )
  )

const dbUserName = credential(constants.pgDbUserName)
const dbPassword = credential(constants.pgDbPassword)

const hostname = constants.pgHostname;
const port = constants.pgPort;
const dbName = constants.pgDbName;
const sequelize = new Sequelize(dbName, dbUserName, dbPassword, 
  host: hostname,
  port: port,
  dialect: constants.dialectName,
  logging: false,
  pool: 
    max: constants.pgMaxPoolConnections,
    min: constants.pgMinPoolConnections,
    acquire: constants.pgMakeConnectionTimeOut,
    idle: constants.pgIdleTimeout
  
);
sequelize.authenticate()
  .then(() => 
    console.log('Successfully connected.');
    User.sync();
    Credentials.sync();
    App.sync();
    Entity.sync();
    EntityField.sync();
    Relationship.sync();
  )
  .catch(err => console.log('Error: ' + err))

我正在使用上面的代码连接到 postgres 数据库。但是我在执行节点索引命令时收到以下错误,这里没有附加 index.js。 我希望 dbUSerName 和 dbUserpassword 值在从 Vault 中获取后传递到 sequelize 连接字符串中。但这些价值观是我无法解决的承诺。

错误:uncaughtException:“字符串”参数必须是字符串类型或 Buffer 或 ArrayBuffer 的实例。收到一个 Promise 实例

【问题讨论】:

【参考方案1】:

credential函数返回Promise,需要将其作为promise函数调用。

您可以在此处阅读有关承诺的信息 https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Global_Objects/Promise

我认为将代码包装在异步函数中并在调用credential之前使用await会更好


async function main() 
    const dbUserName = await credential(constants.pgDbUserName);
    const dbPassword = await credential(constants.pgDbPassword);
 
    // Your code


main();

【讨论】:

在 sequelize.authenticate 之后,我使用 module.exports 导出 sequelize 并将其用于 sequelize.define()。如果我在 main() 函数中添加它,那么 dbUserName 和 dbPassword 没有为 const sequelize = new Sequelize(dbName, dbUserName, dbPassword所以,这个 module.exports = sequelize 不起作用。我不明白,我应该导出函数吗? 可以,可以导出异步函数 如果我导出函数,然后使用这个 const dbConnection = require('../config/dbconfig')//上面的配置文件 const Credentials = dbConnection.sequelize.define('credentials' ,,我收到以下错误 TypeError: Cannot read property 'define' of undefined 你是从主线返回续集吗? 是的,我将它保存在 main 中,如果我将我的 sequelize 语句保存在 main 之外,那么它会在从 vault 收到凭据之前执行,并且我得到了预期的字符串,但收到了承诺

以上是关于nodejs sequelize连接字符串中的异步等待问题的主要内容,如果未能解决你的问题,请参考以下文章

异步响应到javascript NodeJS中的循环

在使用急切加载的 findOne Sequelize 方法期间,Nodejs 堆内存不足

sequelize 跟 原生sql相比 会太多的影响性能么

nodejs:sequelize数据库查询的Op方法

NodeJS/Sequelize/MySQL - 为啥需要 postgres 依赖项?

如何连接nodejs sequelize aws rds mysql数据库和ec2实例