如何在typescript格式的无服务器文件中访问环境变量?

flvlnr44  于 2023-10-22  发布在  TypeScript
关注(0)|答案(2)|浏览(138)

我已经使用这个优秀的模板来使用Node和typescript serverless/lib/plugins/create/templates/aws-nodejs-typescript at master · serverless/serverless · GitHub
在处理程序定义中,我试图引用环境变量
当我打印出变量时,没有插值。变量仍然是带有大括号的${env.CONFIG_TABLE}
“CONFIG_TABLE”:“${env.CONFIG_TABLE}我想使用环境变量进行CI和.env本地开发。

const serverlessConfiguration: AWS = {
  service: 'trial-service',
  frameworkVersion: '2',
  useDotenv: true,

我在处理程序的环境部分设置了变量。文件functions/my-function/index.ts是

import schema from './schema';
import { handlerPath } from '@libs/handlerResolver';

export default {
  handler: `${handlerPath(__dirname)}/handler.main`,
  events: [
    {
      http: {
        method: 'post',
        path: 'make-payment',
        request: {
          schema: {
            'application/json': schema
          }
        }
      }
    }
  ],
  environment: {
    CONFIG_TABLE : "${env.CONFIG_TABLE}",
  }
}
xjreopfe

xjreopfe1#

解决方案是访问process.env。这将从.env文件和环境变量中读取。

environment: {
    CONFIG_TABLE : process.env.CONFIG_TABLE,
oxalkeyp

oxalkeyp2#

在对此进行了一番挣扎之后,我意识到,当迁移到类型脚本配置时,必须以稍微不同的方式考虑配置中的环境变量**。
首先,让我们区分两组环境变量:
1.部署配置
1.功能配置
让我们先讨论(2),因为它是最简单的。在.env文件中解密这些变量并设置useDotEnv标志。无服务器(或dotenv插件)将负责将这些变量加载到无服务器函数中的process.env中,以便在运行时访问。
我相信这个问题更想集中在(1)。在部署配置期间如何访问每个环境变量?
答:你不用dotenv。
你应该设置的唯一的东西是你的STAGE变量:

STAGE=dev sls deploy

这允许您在部署时访问process.env['STAGE'],以按阶段自定义部署。这里有一个示例,说明如何在serverless.ts文件中抽象此内容。

interface Stage {
  SomeVariable: string
}

const stages: {
  [env: string]: Stage
} = {
  dev: {
    Foo: 'bar',
  },
  qa: {
    Foo: 'baz',
  },
}

const stage = stages[process.env['STAGE'] ?? '']

if(!stage) {
  throw new Error("STAGE=[dev|qa] sls deploy")
}

现在,您可以在Serverless定义中访问每个环境的配置。
这具有以下优点:

  • 式安全
  • 部署选项与运行时选项的分离
  • 跨环境的部署选项的协同定位
  • 您可以将此代码移动到另一个模块中并将其导入
  • 您可以对运行时环境变量采用相同的策略,但我将把它作为练习留给读者保存。

相关问题