GCP Storage调用file.exists()报错TypeError:key必须为字符串/Buffer/对象
这个报错和你调用file.exists()的语法无关,是GCP SDK认证阶段抛出的错误,根因是SDK没有拿到合法的私钥用于签名请求,可能的成因如下:
process.env.GOOGLE_APPLICATION_CREDENTIALS环境变量取值错误:要么未赋值,要么赋值的路径不存在,导致SDK无法加载密钥文件。- 密钥JSON文件本身损坏:文件中缺失
private_key字段,或者private_key字段被篡改、格式错误,不符合PEM私钥的标准格式。 - 环境变量值存在冗余字符:比如在.env配置文件中给路径加了多余的引号、前后空格,导致实际读取到的路径和真实密钥文件路径不匹配,加载失败。
- 运行环境没有密钥文件的读取权限:Node进程的执行用户没有密钥文件的读权限,读取到空内容,导致私钥解析失败。
排查步骤
- 先添加调试代码确认密钥加载状态:
const fs = require('fs') // 打印环境变量确认路径取值 console.log('配置的密钥路径:', process.env.GOOGLE_APPLICATION_CREDENTIALS) try { // 尝试读取并解析密钥文件 const keyFileContent = fs.readFileSync(process.env.GOOGLE_APPLICATION_CREDENTIALS, 'utf-8') const keyConfig = JSON.parse(keyFileContent) // 验证私钥字段是否存在且为字符串 if (!keyConfig.private_key || typeof keyConfig.private_key !== 'string') { throw new Error('密钥文件中不存在合法的private_key字段') } console.log('密钥文件校验通过') } catch (e) { console.error('密钥加载失败,错误信息:', e) }
- 修正存储桶API的调用写法(非当前报错原因,仅修正原有不规范写法,避免后续返回值判断出错):
const bucket = storage.bucket(bucketName); const file = bucket.file(path); // 直接解构返回结果,不需要混写await和then const [exists] = await file.exists()
如果确认密钥路径配置没问题但依然报错,可以改用直接传入密钥内容的方式初始化SDK,避免路径解析问题:
const { Storage } = require('@google-cloud/storage'); const fs = require('fs') const storage = new Storage({ projectId: 'my-cloud', credentials: JSON.parse(fs.readFileSync(process.env.GOOGLE_APPLICATION_CREDENTIALS, 'utf-8')), });
内容的提问来源于stack exchange,提问作者M80
相关产品推荐
相关产品推荐

