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

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进程的执行用户没有密钥文件的读权限,读取到空内容,导致私钥解析失败。

排查步骤

  1. 先添加调试代码确认密钥加载状态:
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)
}
  1. 修正存储桶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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:30:03