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

如何在部署于Cloudflare Workers的Next.js应用中访问密钥类环境变量

如何在部署于Cloudflare Workers的Next.js应用中访问密钥类环境变量

我之前也踩过这个坑——带NEXT_PUBLIC_前缀的公开变量能正常读取,但私密的密钥类变量就死活拿不到。其实核心原因是:不带NEXT_PUBLIC_的变量不会被Next.js自动暴露给任何运行环境,包括Cloudflare Workers的Edge Runtime,而且在Edge环境下,直接用process.env访问私密变量的方式也不符合Cloudflare的安全设计。

下面给你一步步的解决办法:

第一步:确认Cloudflare Workers端的配置没问题

先确保你已经在Cloudflare Workers控制面板的对应项目里,把BACKEND_API_KEY添加为Secret Variable(不是普通环境变量,Secret Variable会被加密存储,更安全)。如果用Wrangler CLI部署的话,推荐用命令添加:

wrangler secret put BACKEND_API_KEY

跟着提示输入密钥即可,比手动在面板输入更稳妥。

第二步:在Edge路由中正确获取私密变量

在标记了runtime = 'edge'的route.ts里,不能直接依赖process.env拿私密变量,而是要通过Edge函数的上下文参数来获取。具体改法如下:

// 你的route.ts文件
export const runtime = 'edge';

// 修改请求处理函数,从上下文解构出env对象
export async function GET(request: Request, { env }: { env: { BACKEND_API_KEY: string; NEXT_PUBLIC_BACKEND_URL: string } }) {
  // 从env中取出需要的变量
  const SERVER_URL = env.NEXT_PUBLIC_BACKEND_URL;
  const BACKEND_API_KEY = env.BACKEND_API_KEY || '';

  // 调用自定义函数时,把密钥和服务器地址作为参数传入
  const article = await getArticleByCategoryAndSlug('your-content-type', 'your-slug', SERVER_URL, BACKEND_API_KEY);

  // 返回响应示例
  return NextResponse.json(article);
}

// 修改自定义函数,接收传入的参数
export async function getArticleByCategoryAndSlug<T extends BaseContent>(
  type: ContentType,
  slug: string,
  SERVER_URL: string,
  BACKEND_API_KEY: string
): Promise<T> {
  try {
    const response = await fetch(
      `${SERVER_URL}/articles/type/${type}/slug/${slug}`,
      {
        method: "GET",
        headers: {
          "Content-Type": "application/json",
          "x-backend-api-key": BACKEND_API_KEY,
        },
      }
    );
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }
    const data = await response.json();
    return data;
  } catch (error) {
    console.error("Error fetching article:", error);
    throw error;
  }
}

为什么不能直接用process.env?

这是Cloudflare Edge Runtime的安全设计:Next.js不会把私密环境变量挂载到process.env全局对象上,而是通过函数上下文的env对象传递,避免密钥意外泄漏到不可控的全局环境中。

额外注意事项

  • 绝对不要给私密密钥加NEXT_PUBLIC_前缀,否则会被打包到客户端代码里,造成严重安全风险
  • 确保Cloudflare Workers里的Secret Variable名称和代码里的完全一致(大小写敏感)
  • 如果自定义函数需要在多个地方复用,可以封装一个获取env的工具函数,或者把env作为依赖注入,避免硬编码全局变量

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 03:10:11