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

Pulumi Azure TypeScript 函数内导出存储密钥报ts(1184)错误

错误产生原因

TypeScript 抛出 Modifiers cannot appear here.ts(1184) 错误的核心原因是**export 修饰符仅允许在ES模块的顶层作用域使用,不能出现在函数体内部**。你代码中export const storageAccountKeys语句写在了CreateStorageContainer函数的内部,函数内部属于局部作用域,声明的变量默认作用域仅限函数内部,本身不支持对外导出,因此编译器直接报错。

当前代码存在的编写问题
  • 违反ES Module语法规则:export的作用是将模块顶层的成员暴露给外部引用,函数内部的局部变量本身作用域就被限制在函数内,不存在导出的语法可能性。
  • Pulumi栈输出逻辑理解错误:Pulumi采集部署输出值的规则是识别程序入口文件顶层作用域导出的成员,并非在任意文件任意位置写export就能被识别为输出。你将所有资源创建逻辑封装在函数内部后,函数外部拿不到内部创建的存储账户引用,就算移除export让编译通过,也无法将密钥传递到外层作为栈输出。
  • Output取值逻辑错误:storageAccountKeys是Pulumi的异步Output类型,你写的const primaryStorageKey = storageAccountKeys.keys[0].value是同步直接访问属性的错误写法,会拿到undefined值,必须通过apply方法在回调中取出实际值。
多文件拆分架构下的正确实现方式

按照「入口文件仅保留调用逻辑、资源逻辑全拆分到独立ts文件」的要求,不需要在资源定义文件里做导出,只需要让资源创建函数将需要对外暴露的资源、输出值作为返回值返回,在入口文件接收返回值后做顶层导出即可。

修改后的blob.ts代码

// blob.ts
import * as pulumi from "@pulumi/pulumi";
import * as resources from "@pulumi/azure-native/resources";
import * as storage from "@pulumi/azure-native/storage";

export default function CreateStorageContainer() {
    // 创建Azure资源组
    const resourceGroup = new resources.ResourceGroup("somegroup", {
        location: "westeurope",
        resourceGroupName: "somegroup",
    });

    // 创建存储账户
    const storageAccount = new storage.StorageAccount("sgsomestorageaccount", {
        accountName: "sgsomestorageaccount",
        resourceGroupName: resourceGroup.name,
        sku: {
            name: storage.SkuName.Standard_LRS,
        },
        kind: storage.Kind.StorageV2,
    });

    // 创建Blob容器
    const blobContainer = new storage.BlobContainer("someblobcontainer", {
        accountName: storageAccount.name,
        containerName: "someblobcontainer",
        resourceGroupName: resourceGroup.name,
    });

    // 正确获取存储账户主密钥,处理Pulumi Output异步值
    const primaryStorageKey = pulumi.all([resourceGroup.name, storageAccount.name])
        .apply(([resourceGroupName, accountName]) => 
            storage.listStorageAccountKeys({ resourceGroupName, accountName })
        )
        .apply(accountKeys => accountKeys.keys[0].value);

    // 对外返回需要暴露的资源与输出值
    return {
        resourceGroup,
        storageAccount,
        blobContainer,
        primaryStorageKey
    }
}

修改后的index.ts代码

// index.ts
import CreateStorageContainer from "./blob";

// 调用资源创建逻辑,无其他业务代码
const storageRelatedResources = CreateStorageContainer();

// 入口顶层导出需要展示的栈输出,Pulumi可自动识别
export const storageAccountPrimaryKey = storageRelatedResources.primaryStorageKey;

这种实现完全符合架构要求:

  • index.ts中仅保留函数调用、输出导出逻辑,没有任何Azure资源创建的业务代码
  • 所有资源编排逻辑全部拆分维护在blob.ts中
  • 不存在TS语法错误,存储密钥会被Pulumi正确识别为部署输出,部署完成后可直接查看。

内容的提问来源于stack exchange,提问作者zeenmc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 10:09:15