typescript 如何在无服务器文件中使用访问环境变量?

iqjalb3h  于 2023-03-09  发布在  TypeScript
关注(0)|答案(2)|浏览(195)

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

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

我在处理程序的环境部分设置了变量。

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}",
  }
}
ztyzrc3y

ztyzrc3y1#

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

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

ldioqlga2#

经过一番努力之后,我意识到,当转到typescript配置时,必须稍微改变一下对config中的环境变量的看法。
首先,让我们区分两组环境变量:
1.部署配置
1.功能配置
让我们先讨论(2),因为它是最简单的。在一个. env文件中声明这些变量,并设置useDotEnv标志。serverless(或dotenv插件)将负责将这些变量加载到进程. 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")
}

现在可以在无服务器定义中访问每个环境的配置。
这具有以下优点:

  • 型式安全
  • 部署选项与运行时选项的分离
  • 跨环境的部署选项的共存
  • 您可以将此代码移到另一个模块中并导入它
  • 对于运行时环境变量,您可以遵循相同的策略,但我将把它保存为读者的练习。

相关问题