0

在我的 Pulumi 项目中,我必须在 index.ts 文件中调用
const awsIdentity = await aws.getCallerIdentity({ async: true });

因此,出于这个原因,我必须将所有代码包装到async函数中。我的问题是文件末尾的导出变量。

async function go() {
...
  const awsIdentity = await aws.getCallerIdentity({ async: true });
  const accountId = awsIdentity.accountId;
...
  return {
    dnsZoneName: DNSZone.name,
    BucketID: Bucket.id,
    dbHardURL: DBHost.publicDns,
    devDbURL: publicDbAddress.fqdn,
  };
}

我想要export这 4 个值。我不明白怎么做,但是导出之后的代码(至少pulumi up显示了执行结束时的值)。

const result = go();
export const dnsZoneName = result.then((res) => res.dnsZoneName);

看看这个

我想我不能使用top-level-await

什么是明确的解决方案?

4

3 回答 3

1

对于任何看到这篇文章的人来说,异步入口点现在是 Pulumi 的一等公民,详细信息在这里

您可以拥有与此类似的代码,Pulumi 会自动为您解决所有问题,无需为导出输出做更多事情

export async function go() {
...
  const awsIdentity = await aws.getCallerIdentity({ async: true });
  const accountId = awsIdentity.accountId;
...
  return {
    dnsZoneName: DNSZone.name,
    BucketID: Bucket.id,
    dbHardURL: DBHost.publicDns,
    devDbURL: publicDbAddress.fqdn,
  };
}
于 2021-11-30T05:14:50.537 回答
1

您链接的问题来看,我对您上一个问题的回答中的第一个建议似乎应该有效:为每个值导出一个承诺。根据问题评论,Pulumi 似乎理解导出的承诺。

async function go() {
...
  const awsIdentity = await aws.getCallerIdentity({ async: true });
  const accountId = awsIdentity.accountId;
...
  return {
    dnsZoneName: DNSZone.name,
    BucketID: Bucket.id,
    dbHardURL: DBHost.publicDns,
    devDbURL: publicDbAddress.fqdn,
  };
}

const goPromise = go();
goPromise.catch(error => {
    // Report the error. Note that since we don't chain on this, it doesn't
    // prevent the exports below from rejecting (so Pulumi will see the error too,
    // which seems best).
});
export const dnsZoneName = goPromise.then(res => res.DNSZone.name);
export const BucketID = goPromise.then(res => res.Bucket.id);
export const dbHardURL = goPromise.then(res => res.DBHost.publicDns);
export const devDbURL = goPromise.then(res => res.publicDbAddress.fqdn);

否则:

你说你不认为你可以使用 top-level await,但你没有说为什么。

如果只是您在弄清楚如何使用它时遇到问题,您可以按照提供的方式进行操作aws.getCallerIdentity,并且代码示例的“...”中的任何内容都提供了承诺:

const awsIdentity = await aws.getCallerIdentity({ async: true });
const accountId = awsIdentity.accountId;
// ...
export const dnsZoneName = DNSZone.name;
export const BucketID = Bucket.id;
export const dbHardURL = DBHost.publicDns;
export const devDbURL = publicDbAddress.fqdn;

或者,如果您需要将具有这些属性的对象作为默认导出导出:

const awsIdentity = await aws.getCallerIdentity({ async: true });
const accountId = awsIdentity.accountId;
// ...
export default {
    dnsZoneName: DNSZone.name
    BucketID: Bucket.id
    dbHardURL: DBHost.publicDns
    devDbURL: publicDbAddress.fqdn
};

请注意,在这两种情况下,代码都不在任何函数内,而是在模块的顶层。

使用 Node.js v13 和 v14(到目前为止),您需要--harmony-top-level-await运行时标志。我的猜测是它不会落后于 v15 的标志(甚至可能只是 v14 的更高版本)。

于 2020-06-27T11:13:44.843 回答
-1

你正在处理承诺。因此,答案随时可能到来。你应该做的是,当你调用函数时,你会await等待函数响应

于 2020-06-27T10:47:43.677 回答