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

问题描述 投票:0回答:2

我在 master · serverless/serverless · GitHub 上使用了这个出色的模板来开始使用 Node 和 typescript serverless/lib/plugins/create/templates/aws-nodejs-typescript

在处理程序定义中,我尝试引用环境变量

当我打印出变量时,没有插值。变量仍然是带有大括号的 ${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}",
  }
}
typescript lambda serverless
2个回答
0
投票

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

  environment: {
    CONFIG_TABLE : process.env.CONFIG_TABLE,

0
投票

在为此苦苦挣扎了一段时间后,我意识到,当转向打字稿配置时,必须以稍微不同的方式考虑配置中的环境变量

首先我们来区分一下两组环境变量:

    部署配置
  1. 功能配置
我们先来说(2),因为它是最简单的。在 .env 文件中声明这些变量并设置

useDotEnv

 标志。 Serverless(或 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") }
您现在可以在无服务器定义中访问每个环境的配置。

这有以下优点:

    类型安全
  • 部署选项与运行时选项的分离
  • 跨环境部署选项的共同定位
  • 您可以将此代码移至另一个模块并导入它
  • 您可以对运行时环境变量遵循相同的策略,但我会将其保存为读者的练习。
© www.soinside.com 2019 - 2024. All rights reserved.