所以我在使用 Node 的 gcloud 插件时遇到了一些问题。
我可以通过他们的 GUI 手动创建一个存储桶,然后使用该容器就可以使用 google 提供的 gcloud 库在我的节点程序中写入文件。
当我尝试创建新存储桶时,问题就来了。
storage.createBucket('bucket1', function(err, bucket) {
console.log(err)
console.log(bucket)
});
这始终返回:
{ [Error: Invalid argument.]
errors:
[ { domain: 'global',
reason: 'invalid',
message: 'Invalid argument.' }],
code: 400,
message: 'Invalid argument.}
所以我明白它认为我正在传递一个"无效的论点",在这个如此有用的消息中说了 3 次......然而,我使用的存储桶名称对于我的谷歌存储来说是唯一的。 据我所知,它遵循命名约定。
欢迎任何见解。
这是我用于设置链接的字符串:
storage = gcloud.storage({
keyFilename: __dirname + '/../credentials/XXXXXXXX-b1e05a5128e9.json',
projectId: 'XXXXXXXX'
});
请注意,我在读取和写入通过 GUI 手动创建的存储桶时没有任何问题。 只是无法创建新存储桶。
我还尝试了在所有云存储中使用应该是全局唯一名称:
'com-missingmarble-bucket1'
编辑:按照史蒂文的建议进行 API 测试会产生相同的响应。 我用oAuth验证了浏览器...与节点 API 中完成的身份验证略有不同,但结果是相同的。 虽然我可能没有在 API 测试器中正确格式化我的请求,但我得到的是:
请求:
POST https://www.googleapis.com/storage/v1/b?project=XXXXXXXXX&key={YOUR_API_KEY}
Content-Type: application/json
Authorization: Bearer xxxxxxxxxx
X-JavaScript-User-Agent: Google APIs Explorer
{
"name": "com-missingmarble-bucket1"
}
响应:
400 Bad Request
{
"error": {
"errors": [
{
"domain": "global",
"reason": "invalid",
"message": "Invalid argument."
}
],
"code": 400,
"message": "Invalid argument."
}
}
根据上面的评论,听起来您的问题已解决...
对于将来看到这个问题的人来说,听起来问题是您需要在创建存储桶时提供存储桶应该属于哪个项目。
当您上传/下载文件时,您需要指定一个存储桶,因此 Google 不需要知道项目 ID/编号,因为存储桶是全局唯一的,并且与单个项目相关联。
另一方面,当您创建存储桶时,一组凭证可能有权访问多个项目,因此您需要指定存储桶应属于哪个项目。