TypeError: key 必须是一个字符串,一个缓冲区或一个对象在 typeError 与 GCP 文件存在
Posted
技术标签:
【中文标题】TypeError: key 必须是一个字符串,一个缓冲区或一个对象在 typeError 与 GCP 文件存在【英文标题】:TypeError: key must be a string, a buffer or an object at typeError with GCP file exists 【发布时间】:2021-11-17 07:53:46 【问题描述】:我正在尝试简单地测试我们的 Google Cloud Platform (GCP) 存储中是否存在文件。我在 express js 服务器上使用 GCP 存储桶。下面基本上是从https://googleapis.dev/nodejs/storage/latest/File.html#exists复制的一个非常简单的示例
编辑:这就是我验证 GCP 密钥的方式:
const Storage = require('@google-cloud/storage');
const storage = new Storage(
projectId: 'my-cloud',
keyFilename: process.env.GOOGLE_APPLICATION_CREDENTIALS,
);
const bucketName = 'my-ci';
(稍作改动,我知道你应该返回data[0]
)
const bucket = storage.bucket(bucketName);
const file = bucket.file(path);
const exists = await file.exists().then(data =>
return data
)
但是当我尝试运行它时,我得到了错误:
[nodemon] starting `node --inspect server/server.js`
Debugger listening on ws://127.0.0.1:9229/9a677766-4a93-4499-b57c-55f5f05096d7
For help, see: https://nodejs.org/en/docs/inspector
Server listening on port 4000!
/opt/node_modules/jwa/index.js:115
return new TypeError(errMsg);
^
TypeError: key must be a string, a buffer or an object
at typeError (/opt/node_modules/jwa/index.js:115:10)
at checkIsPrivateKey (/opt/node_modules/jwa/index.js:61:9)
at Object.sign (/opt/node_modules/jwa/index.js:147:5)
at Object.jwsSign [as sign] (/opt/node_modules/jws/lib/sign-stream.js:32:24)
at JWTAccess.getRequestHeaders (/opt/node_modules/google-auth-library/build/src/auth/jwtaccess.js:87:31)
at JWT.getRequestMetadataAsync (/opt/node_modules/google-auth-library/build/src/auth/jwtclient.js:76:51)
at JWT.getRequestHeaders (/opt/node_modules/google-auth-library/build/src/auth/oauth2client.js:238:37)
at GoogleAuth.authorizeRequest (/opt/node_modules/google-auth-library/build/src/auth/googleauth.js:593:38)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
由于错误消息没有给出有用的回溯,我自己做了一些挖掘。通过到处放置console.log
语句,我将范围缩小到一行
const exists = await file.exists().then(data =>
return data
)
并尝试了各种方法,从删除 .then(...)
子句到删除 await
(在承诺解决之前确实有效)。这些似乎都不起作用。
这可能是什么潜在原因?
【问题讨论】:
根据堆栈跟踪,它在登录期间失败(GoogleAuth、google-auth-library)并且似乎无法访问您的代码 根据the docs你需要创建new Storage()
并传递一个keyfile给它
您遇到了凭证问题。这段代码在哪里运行?如果在本地,您是否设置了 Google Cloud CLI 并进行了身份验证?如果在 Google Cloud 中的计算服务(例如 Compute Engine)上运行,您是否将实例设置为具有存储访问权限?需要有关如何授权应用程序访问存储的更多详细信息。
@Vitalii @Jon Hanley 我在代码中做。我已经编辑了帖子,其中包括我通过环境变量使用正确的 GCP 密钥定义它的位置。但是为什么代码在const exists = await file.exists( ...
行失败?当我尝试const file = bucket.file(path);
时,它肯定会失败吗?
【参考方案1】:
最终弄明白了——这是因为 GCP 密钥是旧版本的密钥。如果遇到上述错误,请尝试检查您的密钥是否正确。
【讨论】:
以上是关于TypeError: key 必须是一个字符串,一个缓冲区或一个对象在 typeError 与 GCP 文件存在的主要内容,如果未能解决你的问题,请参考以下文章
pd.merge "TypeError: 字符串索引必须是整数"
读取 JSON 字符串 | TypeError:字符串索引必须是整数
TypeError:float() 参数必须是字符串或数字,而不是“期间”