Nuxt3 Vercel无服务器API端点中@google-cloud/storage运行失败求助
解决Nuxt3 + Vercel无服务器函数中@google-cloud/storage的运行问题
针对你遇到的本地正常、Vercel部署后报错uuid缺失,以及改用require提示未定义的问题,以下是具体解决方案:
核心问题分析
- Nuxt3的Nitro引擎在构建无服务器函数时,可能会对Node.js依赖进行Tree Shaking优化,导致
@google-cloud/storage依赖的uuid模块被误剔除。 - Nuxt3的
server/api目录默认是ESM环境,不支持CommonJS的require语法,因此改用require会报错。
解决方案步骤
1. 确保依赖正确安装并配置Nitro打包规则
首先确认uuid已作为生产依赖安装:
npm install uuid # 或 yarn add uuid
然后在nuxt.config.ts中配置Nitro,将@google-cloud/storage和uuid设为内联打包的依赖,避免被优化掉:
export default defineNuxtConfig({ nitro: { externals: { inline: ['@google-cloud/storage', 'uuid'] } } })
2. 修正私钥的换行处理逻辑
Vercel环境变量中的换行符可能会被转义,建议将私钥的处理逻辑改为更可靠的正则替换:
// 替换原代码中的private_key行 private_key: privKey.replace(/\\n/g, '\n'),
3. 保持ESM导入格式,避免使用require
继续使用ESM风格的导入,不要切换到require,因为Nuxt3的服务器端代码基于ESM:
// 保持原导入方式即可 import { Storage, GetFilesResponse } from "@google-cloud/storage";
4. 清除Vercel构建缓存并重新部署
Vercel的缓存可能导致旧的依赖配置残留,进入Vercel项目控制台,找到部署记录,点击Redeploy并勾选Clear build cache,重新部署项目。
5. 验证环境变量配置
确保Vercel中的gcpPrivateKey、gcpClientEmail、gcpProjectId等环境变量已正确设置,且gcpPrivateKey的格式正确(包含完整的私钥内容,换行符已正确转义或输入)。
代码修改示例
修改后的/server/api/pics/[bucket-name].get.ts核心部分:
// ... 其他导入 const storage: Storage = new Storage({ projectId: runtimeConfig.public.gcpProjectId, credentials: { type: "service_account", private_key: privKey.replace(/\\n/g, '\n'), // 替换为正则替换 client_email: clientEmail, }, }); // ... 其他逻辑
额外提示
如果上述步骤仍未解决问题,可以尝试将@google-cloud/storage降级到较稳定的版本(比如^6.10.0),部分新版本可能存在ESM兼容问题。
内容的提问来源于stack exchange,提问作者Lavrat
相关产品推荐
相关产品推荐

