Can#39;t access process.env values using dynamic keys(可以使用动态密钥访问进程.env值)
问题描述
我有一个nextjs项目(不确定它是否相关,或者它是否适用于整个NodeJS),在该项目中,我希望使用动态键访问process.env
中的值:
const myKey = 'MY_KEY'
console.log(process.env[myKey]) //undefined
作为参考,我尝试过:
console.log(process.env['MY_KEY']) // gives value under MY_KEY
console.log(process.env.MY_KEY) // works too
推荐答案
首先要注意的一点是,如果要在客户端使用env
变量,则need to prefix使用NEXT_PUBLIC_
,或使用older way将它们公开给客户端next.config.js
。
至于这个问题,这是因为webpackDefinePlugin是如何工作的,我相信NextJs内部使用了这个工作方式。它在构建时直接进行文本替换,简而言之,它只查找process.env.MY_KEY
字符串并用值替换它。但如果你拆分它,那么插件就再也找不到process.env.MY_KEY
字符串了,你什么也得不到(process.env
对象无论如何都会生成,但它将是空的)。
虽然这只适用于客户端代码,因为对于服务器端Next实际上使用的是真正的process.env
对象,而解构将在那里工作。
例如,如果我们有NEXT_PUBLIC_MY_KEY=somevalue
,并且我们在代码中的某个位置记录了以下内容:
const key = 'NEXT_PUBLIC_MY_KEY';
console.log(process.env.NEXT_PUBLIC_MY_KEY);
console.log(process.env['NEXT_PUBLIC_MY_KEY']);
console.log(process.env[key]);
console.log(process.env);
在客户端,您将看到:
somevalue
somevalue
undefined
{} // empty object
在服务器端,您将获得:
somevalue
somevalue
somevalue
{ ... } // object with all available env values, even system ones
旧版env docs中有一些有关它的信息。
解决方法
您可能可以使用Runtime Configuration,但它有自己的限制,例如,我认为页面应该是动态的(应该使用getInitialProps
或getServerSideProps
)。
// next.config.js
module.exports = {
publicRuntimeConfig: {
myEnv: 'somevalue',
// or actually use process.env variables, they are all available here
myEnv2: process.env.MY_ENV
},
};
import getConfig from 'next/config';
const key = 'myEnv';
getConfig().publicRuntimeConfig[key] // 'somevalue'
或者像前面提到的另一个答案一样,通过getServerSideProps
传递变量。
编辑:
实际上,我刚刚测试了publicRuntimeConfig
,它甚至可以在静态页面上运行,至少如果您正在使用next start
。不知道为什么文档说页面应该有getServerSideProps
。因此,这可能是最终的解决方案。
这篇关于可以使用动态密钥访问进程.env值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:可以使用动态密钥访问进程.env值
基础教程推荐
- 在for循环中使用setTimeout 2022-01-01
- 悬停时滑动输入并停留几秒钟 2022-01-01
- 响应更改 div 大小保持纵横比 2022-01-01
- 动态更新多个选择框 2022-01-01
- 当用户滚动离开时如何暂停 youtube 嵌入 2022-01-01
- 有没有办法使用OpenLayers更改OpenStreetMap中某些要素 2022-09-06
- Karma-Jasmine:如何正确监视 Modal? 2022-01-01
- 在 JS 中获取客户端时区(不是 GMT 偏移量) 2022-01-01
- 我什么时候应该在导入时使用方括号 2022-01-01
- 角度Apollo设置WatchQuery结果为可用变量 2022-01-01