我是新来的角度。我已经在aws中的docker容器中部署了一个角度应用程序。应用程序需要连接到aws s3 bucket。我不需要硬编码aws键,所以我在docker中设置了一个环境变量。angular被部署为ngbuild中的dist文件夹由nginx docker容器提供服务。
一旦dist文件夹中的内容被送达服务器,是否可以通过角度读取服务器环境变量?就像php和nodejs中的env函数一样
php 和 nodejs 在服务器端运行,这就是为什么它们可以访问服务器环境变量的原因。
当Angular在浏览器中运行时,您的Angular应用程序可以读取的任何内容都会暴露给客户端。我假设您不希望您的AWS密钥在客户端上浮动,任何用户都可以准备它们。这会使您的后端暴露给恶意使用。
如果您真的选择走该路径,则始终可以在您的角度应用程序正在谈论的服务器应用程序中创建一个endpoint,以公开服务器环境变量。
更常见的模式是让您的服务器endpoint将数据提供给角度,而不是它的环境变量:
我过度简化了服务器交互,因为我建议您与此问题分开阅读。这篇文章将帮助您开始后端/前端分离。
不幸的是,在Angular中无法读取类似于nodejs或SpringBoot等服务器框架提供的机制的环境变量。
然而,您可以在Angular应用程序启动之前从服务器加载环境(在采取这种方法之前,请阅读下面的缺点)。
从服务器加载环境变量:
import { Injectable } from "@angular/core";
@Injectable({ providedIn: "root" })
export class EnvService {
public myEnv: string;
fetchEnv() {
// This has to retrieved from some server.
return fetch("some-url").then(env => {this.myEnv = env.myEnv; return Promise.resolve("env loaded");};
}
}
@NgModule({
imports: [BrowserModule, FormsModule],
declarations: [AppComponent, HelloComponent]
})
export class AppModule {
constructor(private envService: EnvService) {}
ngDoBootstrap(app) {
this.envService.fetchEnv().then(() => app.bootstrap(AppComponent));
}
}
这种方法有几个缺点:
因此,我建议在构建过程中配置env变量。
在构建过程中,有两种方法可以设置环境变量:
1) 使用自定义 webpack 配置在构建中设置环境变量
请参阅此文章。
您可以在angular.json中指定自定义webpack配置:
"architect": {
"build": {
"builder": "@angular-builders/custom-webpack:browser",
"options": {
"customWebpackConfig": {
"path": "extra-webpack.config.js"
},
...
webpack配置文件如下所示:
const webpack = require('webpack');
module.exports = {
plugins: [
new webpack.DefinePlugin({
'process.env': {
// Here you can set your env variables.
SERVER_URL: JSON.stringify(process.env.SERVER_URL)
}
})
]
}
此方法需要更多依赖项:
@angular-builders/custom-webpack
dotenv
2) 在生成期间动态创建环境文件
例如,请参阅自动生成的src/environments/environmental.prod.ts。您可以使用正确的环境值生成此文件,或在生成过程中替换此文件中的占位符。
编辑:另见法比奥的答案。您可能不希望您的用户知道 S3 存储桶,并且应尽可能通过 Web 服务器将您的请求路由到存储桶。
问题内容: 有没有办法在Node.js代码中读取环境变量? 例如Python的。 问题答案: process.env.ENV_VARIABLE 您要访问的变量的名称在哪里。
在SpringBoot中读取环境变量的最佳方法是什么? 在Java中,我使用了以下方法: 是否可以使用注释来实现?
我已经安装了tomcat 9.0.11,但是tomcat 9服务器名称没有看到它。要配置它,请提供解决方案 在此输入图像描述
5.3.1 $%envVarName% 当编译时,$%envVarName% 将会被环境变量 envVarName 替换。
我正在尝试使用在我的Quarkus应用程序中读取环境变量,但没有成功。我认为仅指定变量名应该就足够了,但它不起作用: 我还尝试在应用程序中指定一个属性。属性 读起来就像 但变量始终为空。 我错过什么了吗?在Quarkus中读取环境变量的正确方法是什么 我正在使用Quarkus 1.2.0。最终的
在Jenkins中,我试图设置一个动态环境变量。 我使用Scriptler创建了一个Groovy脚本并将结果写入文件。 然后,我使用EnvInject来读取该文件的内容。 Groovy脚本: 设置: 但是,我想要设置的环境变量仍然无法识别: 知道为什么无法识别环境变量吗?