如何从 Node 应用程序客户端访问环境变量

Posted

技术标签:

【中文标题】如何从 Node 应用程序客户端访问环境变量【英文标题】:How to access environment variables from Node app client 【发布时间】:2020-04-04 08:54:20 【问题描述】:

我有一个节点应用程序部署到 Elastic Beanstalk。我有运行客户端以发出 HTTP 请求的 javascript。客户端 javascript 指的是在 URI 中硬编码端口的路由。

Elastic Beanstalk 侦听端口 8081。在我的 app.js 文件中,我可以编写 const port = process.env.PORT || 3000 并且效果很好(因为它在服务器端运行)。

我遇到的困难在于我的客户端 javascript。假设我有这样的东西

fetch('http://localhost:3000/users/login', ...)

要在 Elastic Beanstalk 上运行,我需要将其更改为 8081,但如果我尝试像在 app.js 中那样使其动态化,则找不到 process 变量。具体来说,如果我将路线更改为

const port = process.env.PORT || 3000 
fetch('http://localhost:' + port + '/users/login', ...)

然后我收到以下错误:ReferenceError: Can't find variable: process

我想我理解问题的症结所在(环境变量仅在服务器上可用),但我是 Node/Express 菜鸟,我不确定访问 PORT 环境的最佳方法是什么客户端上的变量。

【问题讨论】:

【参考方案1】:

如果您使用 webpack 捆绑您的 FE 应用程序,您可以配置您的应用程序以将环境变量传递给 FE 应用程序。

这个blog 描述了使用create react app 时它是如何完成的。在检查 webpack 配置时,两个基本上可以解决问题的函数是:

function getClientEnvironment () 
  const raw = Object.keys(process.env)
    // Custom regex to allow only a certain category of variables available to the application
    .filter(<restrict the variables available to the application>)
    .reduce(
      (env, key) => 
        env[key] = process.env[key];
        return env;
      ,
      
        NODE_ENV: process.env.NODE_ENV || 'development'
      
    );
  // Stringify all values so we can feed into Webpack DefinePlugin
  const stringified = 
    'process.env': Object.keys(raw).reduce((env, key) => 
      env[key] = JSON.stringify(raw[key]);
      return env;
    , ),
  ;

  return  raw, stringified ;


const env = getClientEnvironment()

在您的 webpack 配置页面中,您可以将这些添加到 webpack 配置的 plugins 部分:

new InterpolatehtmlPlugin(HtmlWebpackPlugin, env.raw),
new webpack.DefinePlugin(env.stringified)

这将允许您访问js 中的变量

process.env.<VARIABLE NAME>

HTML 中:

%<VARIABLE NAME>%

【讨论】:

以上是关于如何从 Node 应用程序客户端访问环境变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在AWS Almbda中设置环境变量或使用即时客户端库

从React组件内的脚本访问变量

如何从 Node.js 访问、检索、存储和删除文件到远程文件服务器?

如何使用 mod_wsgi 从 django 访问 mod_ssl 环境变量?

在Javascript(node.js,express.js,ejs)中访问服务器端变量[关闭]

从 node.js 访问本机应用程序的字段