首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Node.js:等待需求

Node.js:等待需求
EN

Stack Overflow用户
提问于 2019-03-04 22:24:56
回答 2查看 625关注 0票数 2

我是新的Node.js,我一直在使用第三方提供商的一个示例项目,我试图使用Azure来存储配置值。

在执行其余部分之前,我很难将一个进程转到wait。我会尽我所知来详细说明的。

样本工程有一个名为agent.js的文件,它是起始页/文件。在第16行 (agent_config = require('./config/config.js')[process.env.LP_ACCOUNT][process.env.LP_USER])上,它使用值调用配置文件。我试着用Key Vault设定这些值。我尝试过多种调用函数的组合,甚至实现了async / await,但是agent_config的值总是包含一个[Promise]对象,而不是密钥库返回的数据。

如果我是对的,这是因为Key Vault本身也使用async / await,并且配置文件在返回Key Vault值之前返回。

在这种情况下如何添加/实现密钥库?

以下是我尝试过的:

首次更新agent.js

代码语言:javascript
复制
let agent_config = {};
try {
  agent_config = require('./config/config.js')['123']['accountName'];
} catch (ex) {
  log.warn(`[agent.js] Error loading config: ${ex}`)
}

console.log(agent_config);

测试1

./config/config.js

代码语言:javascript
复制
const KeyVault = require('azure-keyvault');
const msRestAzure = require('ms-rest-azure');
const KEY_VAULT_URI = 'https://' + '{my vault}' + '.vault.azure.net/' || process.env['KEY_VAULT_URI'];

function getValue(secretName, secretVersion) {
  msRestAzure.loginWithAppServiceMSI({ resource: 'https://vault.azure.net' }).then((credentials) => {
    const client = new KeyVault.KeyVaultClient(credentials);
    client.getSecret(KEY_VAULT_URI, secretName, secretVersion).then(
      function (response) {
        return response.Value;
      });
  });
}

module.exports = {
    '123': {
        'accountName': {
            accountId: getValue('mySecretName', '')
         }
     }
};

结果

{ accountsId:未定义}

测试2

使getValue成为async函数,并将其封装在另一个函数周围(尝试不使用包装,也没有工作)

./config/config.js

代码语言:javascript
复制
const KeyVault = require('azure-keyvault');
const msRestAzure = require('ms-rest-azure');
const KEY_VAULT_URI = 'https://' + '{my vault}' + '.vault.azure.net/' || process.env['KEY_VAULT_URI'];

async function getValue(secretName, secretVersion) {
  msRestAzure.loginWithAppServiceMSI({ resource: 'https://vault.azure.net' }).then((credentials) => {
    const client = new KeyVault.KeyVaultClient(credentials);
    client.getSecret(KEY_VAULT_URI, secretName, secretVersion).then(
      function (response) {
        return response.Value;
      });
  });
}

async function config() {
    module.exports = {
        '123': {
            'accountName': {
                accountId: await getValue('mySecretName', '')
             }
         }
    };
}

config();

结果

{}

测试3

使getValue成为async函数,并将其封装在另一个函数周围(尝试不使用包装,也没有工作)

./config/config.js

代码语言:javascript
复制
const KeyVault = require('azure-keyvault');
const msRestAzure = require('ms-rest-azure');
const KEY_VAULT_URI = 'https://' + '{my vault}' + '.vault.azure.net/' || process.env['KEY_VAULT_URI'];

async function getValue(secretName, secretVersion) {
  return msRestAzure.loginWithAppServiceMSI({ resource: 'https://vault.azure.net' })
    .then((credentials) => {
      const client = new KeyVault.KeyVaultClient(credentials);
      return client.getSecret(KEY_VAULT_URI, secretName, secretVersion).then(
        function (response) {
          return response.Value;
        });
    });
}

module.exports = {
    '123': {
        'accountName': {
            accountId: getValue('mySecretName', '')
        }
    }
};

config();

结果

{ accountId:{}}

其他

我尝试过许多其他方法,如module.exports = async (value) =< {...} (通过其他问题/解决方案找到,但没有成功)。

我开始认为我需要在agent.js上做一些“等待”,但我还没有找到这方面的好信息。

任何帮助都会很好!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-04 23:47:26

一个问题是您的getValue函数没有返回任何内容,因为您的返回需要是显式的。

(不兑现诺言,就没有什么可等待的了)

代码语言:javascript
复制
async function getValue(secretName, secretVersion) {
  return msRestAzure.loginWithAppServiceMSI({ resource: 'https://vault.azure.net' })
    .then((credentials) => {
      const client = new KeyVault.KeyVaultClient(credentials);
      return client.getSecret(KEY_VAULT_URI, secretName, secretVersion).then(
        function (response) {
          return response.Value;
        });
    });
}

您还可以使用箭头函数获得不太显式的返回。

代码语言:javascript
复制
const getValue = async (secretName, secretVersion) => 
  msRestAzure.loginWithAppServiceMSI({ resource: 'https://vault.azure.net' })
    .then(credentials => {
      const client = new KeyVault.KeyVaultClient(credentials);
      return client.getSecret(KEY_VAULT_URI, secretName, secretVersion)
        .then(response => response.Value);
    });

引入Azure键Vault read,即异步,意味着您的整个配置读取都是异步的。你没办法绕开那条路。这意味着使用配置的代码将需要适当地处理它。首先导出一个异步函数,该函数将返回配置。

代码语言:javascript
复制
async function getConfig() {
  return {
    '123': {
      'accountName': {
        accountId: await getValue('mySecretName', '')
      }
    }
  };
}

module.exports = getConfig;

在您的代理代码中,您可以调用该函数。这将意味着您的代理代码也需要包装在一个函数中,所以可能是这样的..

代码语言:javascript
复制
const Bot = require('./bot/bot.js');
const getConfig = require('./config/config.js');

getConfig().then(agentConfig => {
    const agent = new Bot(agentConfig);

    agent.on(Bot.const.CONNECTED, data => {
        log.info(`[agent.js] CONNECTED ${JSON.stringify(data)}`);
    });
});
票数 2
EN

Stack Overflow用户

发布于 2020-12-22 01:57:11

azure-keyvault已被废弃,而支持新的包来分别处理密钥库密钥、机密和证书。对于您的场景,您可以使用新的@azure/密钥库-秘密包与Key Vault对话,使用新的@azure/identity包创建凭据。

代码语言:javascript
复制
const { SecretClient } = require("@azure/keyvault-secrets");
const { DefaultAzureCredential } = require("@azure/identity");

async function getValue(secretName, secretVersion) {
  const credential = new DefaultAzureCredential();
  const client = new SecretClient(KEY_VAULT_URI, credential);
  const secret = await client.getSecret(secretName);
  return secret.value;
}

DefaultAzureCredential假设您已经设置了以下env变量

  • AZURE_TENANT_ID: Azure Active中的租户ID
  • AZURE_CLIENT_ID:在AAD租户中注册的应用程序(客户端) ID
  • AZURE_CLIENT_SECRET:注册应用程序的客户端机密

若要尝试其他凭据,请参阅@azure/identity自述 (如果您要从旧的azure-keyvault包中迁移),请签出迁移指南以了解主要的更改。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54992520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档