如何在部署于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
相关产品推荐
相关产品推荐

