You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NextJS 12.2.5中NEXT_PUBLIC前缀环境变量客户端未定义问题

NextJS 12.2.5客户端NEXT_PUBLIC环境变量未定义问题排查与解决

问题背景

在NextJS 12.2.5版本中,所有客户端暴露的环境变量均已添加NEXT_PUBLIC前缀,但客户端访问页面时抛出Environment variable NEXT_PUBLIC_STATIC_MUSTER_URL was not defined!错误,服务端无缺失变量提示。相关配置与代码如下:

1. .env.development配置

DATABASE_URL="postgresql://dbuser:dbpass@localhost:5432/db?schema=public"
NEXT_PUBLIC_STATIC_MUSTER_URL="http://localhost:8080/muster"
NEXT_PUBLIC_MUSTER_SEARCH_HOST="http://localhost:7777"
NEXT_PUBLIC_MUSTER_SEARCH_API_KEY ="key"  # 等号后存在空格
NEXT_PUBLIC_NEWS_API_KEY="another_key"
NEXT_PUBLIC_NEWS_API_URL="http://localhost:8888"
NEXT_PUBLIC_BASE_URL="http://localhost:3000"

2. utils/env.ts验证逻辑

function defaultValidator(key: string) {
    const value = process.env[key];

    if (value) {
        return value;
    }

    throw new Error(`Environment variable ${key} was not defined!`);
}

export const env = {
    NODE_ENV: process.env.NODE_ENV,
    NEXT_PUBLIC_STATIC_MUSTER_URL: defaultValidator("NEXT_PUBLIC_STATIC_MUSTER_URL"),
    NEXT_PUBLIC_MUSTER_SEARCH_HOST: defaultValidator("NEXT_PUBLIC_MUSTER_SEARCH_HOST"),
    NEXT_PUBLIC_MUSTER_SEARCH_API_KEY: defaultValidator("NEXT_PUBLIC_MUSTER_SEARCH_API_KEY"),
    NEXT_PUBLIC_NEWS_API_KEY: defaultValidator("NEXT_PUBLIC_NEWS_API_KEY"),
    NEXT_PUBLIC_NEWS_API_URL: defaultValidator("NEXT_PUBLIC_NEWS_API_URL"),
    NEXT_PUBLIC_BASE_URL: defaultValidator("NEXT_PUBLIC_BASE_URL"),
}

3. pages/test.tsx使用代码

import { env } from 'utils/env'
export default function Test() {
   return (<div>{JSON.stringify({url: env.NEXT_PUBLIC_STATIC_MUSTER_URL})}</div>)
}

客户端报错信息

Unhandled Runtime Error
Error: Environment variable NEXT_PUBLIC_STATIC_MUSTER_URL was not defined!

解决方案

1. 修复.env文件格式错误

.env.development中NEXT_PUBLIC_MUSTER_SEARCH_API_KEY ="key"一行的等号后存在空格,会导致环境变量解析异常,甚至影响其他变量的加载。将其修改为:

NEXT_PUBLIC_MUSTER_SEARCH_API_KEY="key"

2. 调整验证逻辑适配客户端运行

NextJS在构建时会将NEXT_PUBLIC_前缀的变量静态替换到客户端代码中,但原验证函数在客户端运行时,若变量未被正确注入会直接抛出错误。修改验证逻辑,仅在服务端执行严格验证:

function defaultValidator(key: string) {
    const value = process.env[key];

    // 服务端环境下强制验证变量存在
    if (typeof window === 'undefined') {
        if (!value) {
            throw new Error(`Environment variable ${key} was not defined!`);
        }
    }

    return value;
}

export const env = {
    NODE_ENV: process.env.NODE_ENV,
    NEXT_PUBLIC_STATIC_MUSTER_URL: defaultValidator("NEXT_PUBLIC_STATIC_MUSTER_URL"),
    NEXT_PUBLIC_MUSTER_SEARCH_HOST: defaultValidator("NEXT_PUBLIC_MUSTER_SEARCH_HOST"),
    NEXT_PUBLIC_MUSTER_SEARCH_API_KEY: defaultValidator("NEXT_PUBLIC_MUSTER_SEARCH_API_KEY"),
    NEXT_PUBLIC_NEWS_API_KEY: defaultValidator("NEXT_PUBLIC_NEWS_API_KEY"),
    NEXT_PUBLIC_NEWS_API_URL: defaultValidator("NEXT_PUBLIC_NEWS_API_URL"),
    NEXT_PUBLIC_BASE_URL: defaultValidator("NEXT_PUBLIC_BASE_URL"),
}

3. 重启开发服务器

修改.env文件后,NextJS不会自动重新加载环境变量,必须重启开发服务器才能让新配置生效。

4. 验证变量注入情况

若问题仍存在,可直接在客户端打印process.env变量排查是否注入成功:

export default function Test() {
   return (<div>{JSON.stringify({
       directUrl: process.env.NEXT_PUBLIC_STATIC_MUSTER_URL,
       envUrl: env.NEXT_PUBLIC_STATIC_MUSTER_URL
   })}</div>)
}

如果直接使用process.env能获取到值,说明是验证函数逻辑问题,按步骤2调整即可。


内容的提问来源于stack exchange,提问作者valerius21

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:24:27