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

Next.js环境变量可打印但执行时无法使用问题求助

问题与解决方案

问题

打印process.env.SUPABASE_SERVICE_ROLE_KEY时显示该变量已定义,但代码执行时却提示缺失;硬编码服务角色密钥后代码运行正常。相关代码如下:

import { createClient } from "@supabase/supabase-js";

const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL;
const supabaseAnonKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY;
const supabaseServiceKey = process.env.SUPABASE_SERVICE_ROLE_KEY;

export const supabasePublic = createClient(
  supabaseUrl,
  supabaseAnonKey
);

console.log("supabaseServiceKey: ", supabaseServiceKey);

if (!supabaseServiceKey) {
  throw new Error("Missing SUPABASE_SERVICE_ROLE_KEY");
}

export const supabasePrivate = createClient(
  supabaseUrl,
  supabaseServiceKey
);

在Next.js项目中用npm run dev启动,刷新页面时supabaseServiceKey能正常打印,但随后会触发Missing SUPABASE_SERVICE_ROLE_KEY错误。

执行路径如下:

/pages/checkout (客户端)  
/src/services/balance (客户端)  
/pages/api/get-balance (服务端)  
/src/utils/supabase/fetch-row (服务端,因被导入到API路由)  
/src/utils/supabase/create-client (服务端,因被导入到API路由)

更奇怪的是,错误抛出后还有日志暗示Supabase客户端已创建成功。

解决方案

1. 明确环境变量作用域

SUPABASE_SERVICE_ROLE_KEY是服务端专用变量,Next.js不会将不带NEXT_PUBLIC_前缀的环境变量暴露给客户端。你的代码同时被客户端和服务端导入,服务端渲染时能打印变量值,但客户端执行时该变量会变为undefined,进而触发错误。

2. 拆分客户端与服务端的Supabase客户端逻辑

将服务端专用的客户端创建代码单独隔离,避免被客户端代码导入:

服务端专用客户端文件(src/utils/supabase/server-client.js)

import { createClient } from "@supabase/supabase-js";

const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL;
const supabaseServiceKey = process.env.SUPABASE_SERVICE_ROLE_KEY;

if (!supabaseServiceKey) {
  throw new Error("Missing SUPABASE_SERVICE_ROLE_KEY");
}

export const supabasePrivate = createClient(
  supabaseUrl,
  supabaseServiceKey
);

客户端专用客户端文件(src/utils/supabase/client-client.js)

import { createClient } from "@supabase/supabase-js";

const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL;
const supabaseAnonKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY;

export const supabasePublic = createClient(
  supabaseUrl,
  supabaseAnonKey
);

3. 检查环境变量配置与加载

  • 确认.env.local文件中SUPABASE_SERVICE_ROLE_KEY拼写无误,无多余空格或格式错误。
  • 重启npm run dev服务,确保环境变量重新加载生效。

4. 验证导入路径

确保服务端API路由仅导入服务端专用的supabasePrivate,客户端代码仅导入supabasePublic,彻底避免跨环境导入导致的变量缺失问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 00:37:39