无法使用动态键访问 process.env 值

Jac*_*bdo 6 javascript node.js next.js

我有一个 nextjs(不确定它是否具有任何相关性或它是否适用于整个 nodejs)项目,我想在其中process.env使用动态键访问值:

const myKey = 'MY_KEY'
console.log(process.env[myKey]) //undefined
Run Code Online (Sandbox Code Playgroud)

作为参考,我尝试过:

console.log(process.env['MY_KEY']) // gives value under MY_KEY
console.log(process.env.MY_KEY) // works too
Run Code Online (Sandbox Code Playgroud)

Dan*_*ila 8

首先,有一点需要注意,如果你想env在客户端使用变量,那么你需要给它们加上前缀NEXT_PUBLIC_,或者使用旧的方式将它们暴露给客户端内部next.config.js

至于问题,这是由于 Webpack DefinePlugin工作方式的性质,我相信 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);
Run Code Online (Sandbox Code Playgroud)

在客户端,您将获得:

somevalue
somevalue
undefined
{} // empty object
Run Code Online (Sandbox Code Playgroud)

在服务器端,您将获得:

somevalue
somevalue
somevalue
{ ... } // object with all available env values, even system ones
Run Code Online (Sandbox Code Playgroud)

在旧的env docs中有一些关于它的信息。

解决方法

您可能可以使用Runtime Configuration,但它有自己的局限性,例如,我认为页面应该是动态的(应该使用getInitialPropsgetServerSideProps)才能工作。

// next.config.js
module.exports = {
  publicRuntimeConfig: {
    myEnv: 'somevalue',
    // or actually use process.env variables, they are all available here
    myEnv2: process.env.MY_ENV
  },
};

Run Code Online (Sandbox Code Playgroud)
import getConfig from 'next/config';

const key = 'myEnv';

getConfig().publicRuntimeConfig[key] // 'somevalue' 
Run Code Online (Sandbox Code Playgroud)

或者只是getServerSideProps像提到的其他答案一样传递你的变量。

编辑: 我实际上刚刚测试过publicRuntimeConfig,它甚至可以在静态页面上工作,至少在您使用next start. 不知道为什么文档说页面应该有getServerSideProps. 所以这可能是最终的解决方案。