next.js 环境变量未定义(Next.js 10.0.5)

问题描述 投票:0回答:10

我正在使用 Next.js 编写一个网站,并尝试添加谷歌标签管理器。
我按照 Next.js Github 示例上的教程进行操作,但由于某些原因我无法访问我的环境变量。
它说我的变量未定义。
我在项目文件夹中创建了一个文件 .env.local (与组件、node_modules、页面等处于同一级别)
在这个文件中,我创建了一个像这样的变量(测试目的):

NEXT_PUBLIC_DB_HOST=localhost

在我的索引页上我尝试了这段代码:

console.log("test ", process.env.NEXT_PUBLIC_DB_HOST);

但是在我的控制台中我得到一个“测试未定义”。
我尝试将变量放入 .env 文件中,但没有成功。
我做错了什么?

javascript environment-variables next.js undefined
10个回答
125
投票

此环境仅适用于服务器端。要在客户端访问此环境,您需要在 next.config.js 中声明

这样:

module.exports = {
  reactStrictMode: true,
  env: {
    BASE_URL: process.env.BASE_URL,
  }
}

70
投票
  1. 创建.env(所有环境).env.development(开发环境)和.env.product(生产环境)。

  2. 将前缀 NEXT_PUBLIC 添加到所有环境变量中。

NEXT_PUBLIC_API_URL=http://localhost:3000/

  1. 与前缀 process.env 一起使用

process.env.NEXT_PUBLIC_API_URL

  1. 停止服务器并重新启动:

npm 运行开发

  1. 我希望它能起作用。 此解决方案适用于最新版本的 nextJs(9 以上)

29
投票

对于那些使用 NextJS +9 并在浏览器中查找环境变量的人,您应该使用

NEXT_PUBLIC_
前缀。示例:

NEXT_PUBLIC_ANALYTICS_ID=123456789

请参阅参考文档


24
投票

重新启动服务器对我有用。

  1. 编辑并保存.env.local
  2. 停止服务器并重新启动,
    npm run dev
  3. 您应该在下一行得到如下输出:
> k[email protected] dev
> next dev

Loaded env from [path]/.env.local

12
投票

在花费了无数时间之后,我发现在 nextjs 9.4 的前后文档中都有一个小段落:

关键词是构建时间。这意味着您必须在运行

next build
时设置这些变量,而不是(仅)在
next start
时设置,以便客户端可以访问这些变量。


6
投票

视频参考代码grepper链接 https://youtu.be/6qhF9l_AgAk

process.env 只能在服务器中工作,不能在浏览器中工作,所以它会显示未定义 要修复它,请在 .env.local 或 .env 中使用 NEXT_PUBLIC_before APi 密钥 该解决方案仅适用于 nextjs 版本 9。

NEXT_PUBLIC_BACKEND_API =“http://localhost:1337/graphql”

像 MongoURl 和 openAi 密钥这样的秘密环境不应该使用 Next_PUBLIC_ 否则它将暴露给浏览器并且每个人都可以使用它。

MONGO_URL=

OPENAI_API_KEY=


3
投票

这是我的 next.config.js 文件。

/** @type {import('next').NextConfig} */
const nextConfig = {
  reactStrictMode: true,
  env: {
    BASE_URL: process.env.NEXT_PUBLIC_SITE_URL,
  },
};

module.exports = nextConfig;

重新启动服务器,一切正常。将 Nextjs 12.1.0 与 typescript 一起使用


2
投票

添加最新版本的文档,v12+。

使用 next.config.js 文件,您可以指定服务器和客户端变量:

module.exports = {
  serverRuntimeConfig: {
    // Will only be available on the server side
    mySecret: 'secret',
    secondSecret: process.env.SECOND_SECRET, // Pass through env variables
  },
  publicRuntimeConfig: {
    // Will be available on both server and client
    staticFolder: '/static',
  },
}

您仍然可以使用 env.local 文件,并将变量传递到 next.config.js 文件。例如:

 publicRuntimeConfig: {
   DB_URL: process.env.DB_URL
 }

然后你可以像这样访问变量:

import getConfig from 'next/config';
const { publicRuntimeConfig } = getConfig();
publicRuntimeConfig.DB_URL;

1
投票

就我而言,我粘贴 REACT_APP_API_URL 而不是 NEXT_PUBLIC_API_URL。


0
投票
  1. 检查您的 .Env 文件:

    确保您已在其中定义了周围环境变量 适当的 .Env 文件。在 Next.Js 中,您可以使用 one-of-a-kind 用于特殊环境的 .Env 文件(例如,.Env.Local 用于 邻里开发和制造业的环境生产)。 确保您要访问的变量已定义 在正确的 .Env 文件中。

  2. 重新启动您的开发服务器:

    添加或增强环境变量后,确保重新启动 您的开发服务器。有时,环境的改变 变量要重启服务器才会生效。

  3. 使用process.env访问环境变量:

    在 Next.js 中,您可以使用 process.env 访问环境变量。为了 例子: const myVar = process.env.MY_VARIABLE;

© www.soinside.com 2019 - 2024. All rights reserved.