我有一个 Nest JS Lambda 后端,我正在使用
serverless-offline
模块在本地运行它并连接到我的本地 Postgres 数据库。
我的 serverless.yml 文件看起来像
service: wbx-borrower-onboarding-service
frameworkVersion: '3'
plugins:
- serverless-offline
- serverless-plugin-log-retention
- serverless-prune-plugin
- serverless-dotenv-plugin
package:
individually: true
custom:
stage: ${opt:stage}
region: ${env:REGION, 'ap-south-1'}
accountId: ${aws:accountId}
prune:
automatic: true
number: 5
logRetentionPeriod:
dev: 14
prod: 90
provider:
name: aws
runtime: nodejs18.x
stage: ${opt:stage, 'dev'}
region: ${opt:region, 'ap-south-1'}
timeout: 30
apiGateway:
binaryMediaTypes:
- "multipart/form-data"
environment:
NODE_ENV: ${self:provider.stage}
CLERK_API_KEY: ${ssm:/wbx/${self:provider.stage}/clerk/secret/key}
WBX_BORROWER_ONBOARDING_DOCS_S3_BUCKET: wbx-borrower-onboarding-docs
WBX_DB_PROXY: ${ssm:/wbx/${self:provider.stage}/db/proxy}
WBX_DB_HOST: ${ssm:/wbx/${self:provider.stage}/db/host}
WBX_DB_USER: ${ssm:/wbx/${self:provider.stage}/db/user}
WBX_DB_PASSWORD: ${ssm:/wbx/${self:provider.stage}/db/password}
WBX_DB_NAME: woodbox
functions:
<FUNCTION>
我的本地 .env 文件看起来像
WBX_DB_PROXY=localhost
WBX_DB_HOST=localhost
WBX_DB_USER=postgres
WBX_DB_PASSWORD=mydbpwd
WBX_DB_NAME=mydb
WBX_BORROWER_ONBOARDING_DOCS_S3_BUCKET=my-bucket
CLERK_API_KEY=api-key
FAKE_VAR=hellohello
我的
app.module.ts
看起来像
import { Module } from '@nestjs/common';
import pg from 'pg';
import { SequelizeModule } from '@nestjs/sequelize';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { OnboardingModule } from './onboarding/onboarding.module';
import { Borrower } from './models/index';
@Module({
imports: [
SequelizeModule.forRoot({
dialect: 'postgres',
dialectModule: pg,
host: process.env.WBX_DB_PROXY,
port: 5432,
username: process.env.WBX_DB_USER,
password: process.env.WBX_DB_PASSWORD,
database: process.env.WBX_DB_NAME,
models: [Borrower],
}),
OnboardingModule,
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
当我运行
sls offline start --reloadHandler --stage dev
时,它会在终端上打印以下内容
DOTENV: Loading environment variables from .env:
- WBX_DB_PROXY
- WBX_DB_HOST
- WBX_DB_USER
- WBX_DB_PASSWORD
- WBX_DB_NAME
- WBX_BORROWER_ONBOARDING_DOCS_S3_BUCKET
- CLERK_API_KEY
- FAKE_VAR
Starting Offline at stage dev (ap-south-1)
这意味着它正在读取本地 .env 文件,但是当控件到达
app.module.ts
时,它会以某种方式读取我在 AWS 帐户上配置的实际 ssm 参数。我知道这一点是因为当我在服务中打印 console.log(process.env.WBX_DB_HOST);
时,它返回实际的 RDS 端点,而不是本地 .env 中给出的本地主机
我什至尝试单独安装 dotenv 插件并在 app.module.ts 中调用它,然后在 main.ts 中调用它,但它仍然没有帮助
您可以根据条件提供
environment
值(例如:stage
)。然后,当阶段为dev
时,让提供一个空对象,否则提供来自SSM的env值。
service: wbx-borrower-onboarding-service
frameworkVersion: '3'
plugins:
- serverless-offline
- serverless-dotenv-plugin
package:
individually: true
custom:
stage: ${opt:stage}
region: ${env:REGION, 'ap-south-1'}
accountId: ${aws:accountId}
prune:
automatic: true
number: 5
logRetentionPeriod:
dev: 14
prod: 90
environment: # Define env object for 2 stages
prod:
NODE_ENV: ${self:provider.stage}
CLERK_API_KEY: ${ssm:/wbx/${self:provider.stage}/clerk/secret/key}
WBX_BORROWER_ONBOARDING_DOCS_S3_BUCKET: wbx-borrower-onboarding-docs
WBX_DB_PROXY: ${ssm:/wbx/${self:provider.stage}/db/proxy}
WBX_DB_HOST: ${ssm:/wbx/${self:provider.stage}/db/host}
WBX_DB_USER: ${ssm:/wbx/${self:provider.stage}/db/user}
WBX_DB_PASSWORD: ${ssm:/wbx/${self:provider.stage}/db/password}
WBX_DB_NAME: woodbox
dev: {} # Empty
provider:
name: aws
runtime: nodejs18.x
stage: ${opt:stage, 'dev'}
region: ${opt:region, 'ap-south-1'}
timeout: 30
apiGateway:
binaryMediaTypes:
- "multipart/form-data"
environment: ${self:custom.environment.${opt:stage}} # Select env object based on the stage