Reactjs NextJS环境变量是';行不通

Reactjs NextJS环境变量是';行不通,reactjs,next.js,Reactjs,Next.js,我已经花了至少一个小时来研究这个问题,到目前为止我被难住了。也许我不理解文档或媒体文章。但是,据我所知,NextJS(我已经安装了最新版本)提供了内置的env变量解决方案。因此,不需要dotenv包 由于NextJS已经设置好了,所以我需要做的就是创建一个env.local来存储我的API_密钥和其他敏感信息。然后,保存更新后的文件后,我应该能够访问${process.env.API_KEY},并可以访问代码中的任何位置的值 如果上述陈述属实,我就无法做到这一点 在我的例子中,我使用环境变量连接

我已经花了至少一个小时来研究这个问题,到目前为止我被难住了。也许我不理解文档或媒体文章。但是,据我所知,NextJS(我已经安装了最新版本)提供了内置的env变量解决方案。因此,不需要
dotenv

由于NextJS已经设置好了,所以我需要做的就是创建一个
env.local
来存储我的API_密钥和其他敏感信息。然后,保存更新后的文件后,我应该能够访问
${process.env.API_KEY}
,并可以访问代码中的任何位置的值

如果上述陈述属实,我就无法做到这一点

在我的例子中,我使用环境变量连接到Firebase。在下面的代码中,它正在被实现。我得到一个500错误:

Connection GRPC stream error. Code: 3 Message: 3 INVALID_ARGUMENT: 
Project id parakeat-a1-7706, is malformed: it either contains invalid 
characters or is too long. Look at https://cloud.google.com
/resource-manager/docs/creating-managing-projects#identifying_projects 
for instructions in how to get a project's id.

上面显示的ID是正确的,那么怎么了?为什么如果我直接将实际值放入并跳过process.env,它会成功连接?

默认情况下,通过
.env.local
加载的所有环境变量仅在Node.js环境中可用(在getStaticProps等方法中),这意味着它们不会公开给浏览器

为了向浏览器公开变量,必须在变量前面加上
NEXT\u PUBLIC\u
。例如:

NEXT_PUBLIC_ANALYTICS_ID=abcdefghijk

默认情况下,通过
.env.local
加载的所有环境变量仅在Node.js环境中可用(在getStaticProps等方法中),这意味着它们不会向浏览器公开

为了向浏览器公开变量,必须在变量前面加上
NEXT\u PUBLIC\u
。例如:

NEXT_PUBLIC_ANALYTICS_ID=abcdefghijk

我以前使用过上述解决方案,但后来需要在bundle中包含my.env变量,这就是我使用next.config.js文件存放变量的原因

请查看其文档的此链接以供参考:


我以前使用过上述解决方案,但后来需要在bundle中包含my.env变量,这就是我使用next.config.js文件存放变量的原因

请查看其文档的此链接以供参考:


Hm,我相信添加
NEXT\u PUBLIC…
前缀也会导致给定的环境变量暴露给客户端。这对API_密钥和我们想要保护web config Firebase的其他信息是有害的,前提是您要在客户端中使用。看看这个。对于要在客户端和服务器端同时使用的环境变量,请添加
NEXT\u PUBLIC
前缀。对于只想在服务器端使用的环境变量,不要添加前缀。啊,非常感谢。这增加了很多清晰度,因此在这种情况下,我不需要处理所有这些值。关于你最后的评论,我认为你的说法有矛盾之处。“对于要在客户端和服务器端同时使用的环境变量,请添加下一个\u公共前缀。对于只想在服务器端使用的环境变量,请不要添加前缀。”“您不希望在客户端显示该私钥,这意味着您应该为该密钥添加下一个\u公共前缀。”这是一个拼写错误吗?哦,对,那是个打字错误。我将删除它,这样就不会混淆其他人。我的意思是:Firebase还为您提供了一个私钥,供您使用Firebase Admin SDK。您不希望在客户端显示该私钥,这意味着您不应该为该密钥添加下一个公共前缀。您好。我正试图在这里做完全相同的事情。我有带密钥的firebaseConfig.js文件。我用我的秘密创建了一个
env.local
文件。并使用与上述问题顶部相同的语法设置config对象。问题是我遇到了一个错误
FIREBASE致命错误:无法确定FIREBASE数据库URL。在调用firebase.initializeApp()时,请确保包含项目ID,我相信添加
NEXT\u PUBLIC…
前缀也会导致给定的环境变量向客户端公开。这对API_密钥和我们想要保护web config Firebase的其他信息是有害的,前提是您要在客户端中使用。看看这个。对于要在客户端和服务器端同时使用的环境变量,请添加
NEXT\u PUBLIC
前缀。对于只想在服务器端使用的环境变量,不要添加前缀。啊,非常感谢。这增加了很多清晰度,因此在这种情况下,我不需要处理所有这些值。关于你最后的评论,我认为你的说法有矛盾之处。“对于要在客户端和服务器端同时使用的环境变量,请添加下一个\u公共前缀。对于只想在服务器端使用的环境变量,请不要添加前缀。”“您不希望在客户端显示该私钥,这意味着您应该为该密钥添加下一个\u公共前缀。”这是一个拼写错误吗?哦,对,那是个打字错误。我将删除它,这样就不会混淆其他人。我的意思是:Firebase还为您提供了一个私钥,供您使用Firebase Admin SDK。您不希望在客户端显示该私钥,这意味着您不应该为该密钥添加下一个公共前缀。您好。我正试图在这里做完全相同的事情。我有带密钥的firebaseConfig.js文件。我用我的秘密创建了一个
env.local
文件。并使用与上述问题顶部相同的语法设置config对象。问题是我遇到了一个错误
FIREBASE致命错误:无法确定FIREBASE数据库URL。在调用firebase.initializeApp()时,请确保包含一个项目ID。
文档中说,下面的版本
9.4
中有我在上面尝试的内置解决方案。它说使用
.env.local