我有另一个项目,这个相同的代码成功运行,所以它可能是我这次错过的一些配置选项。我正在使用Google Cloud API访问firebase存储空间。
为清楚起见,文件确实存在。
var storage = require('@google-cloud/storage')({
keyFilename: 'serviceAccountKey.json',
projectId: 'my-id'
});
var bucket = storage.bucket('my-id.appspot.com');
var file = bucket.file('directory/file.json'); //this exists!
file.exists(function(err, exists){
console.log("Checking for challenges file. Results:" + exists + ", err:" + err); //returns "Checking for challenges file. Results:true, err:nil"
if (exists) {
console.log("File exists. Printing."); //prints "File exists. Printing."
file.download().then(function(currentFileData) {
console.log("This line is never reached.");
}).catch(err => {
console.error('ERROR:', err); //gives a 404 error
});
}
});
它打印出以下捕获的错误,而不是打印“永远不会到达此行”。
ERROR: { ApiError: Not Found at Object.parseHttpRespMessage (/user_code/node_modules/@google-cloud/storage/node_modules/@google-cloud/common/src/util.js:156:33) at Object.handleResp ... ...
完整错误很大,所以除非有要求,否则我不会将其全部发布在此处。
答案 0 :(得分:0)
尝试访问该文件的用户可能只能通过存储桶访问,但不能访问该文件。检查两个项目中存储桶和文件的ACL,并比较得到的结果:
myBucket.acl.get()
.then(acls => console.log("Bucket ACLs:", acls));
myFile.acl.get()
.then(acls => console.log("File ACLs:", acls));
你应该看到这样的输出:
[ [ { entity: 'user-abenavides333@gmail.com', role: 'OWNER' },
{ entity: 'user-dwilches@gmail.com', role: 'OWNER' } ],
{ kind: 'storage#objectAccessControls',
items: [ [Object], [Object] ] } ]
如果没有区别,请尝试以下相同代码的详细版本:
myBucket.acl.get()
.then(acls => console.log("Bucket ACLs:", JSON.stringify(acls, null, '\t')));
myFile.acl.get()
.then(acls => console.log("File ACLs:", JSON.stringify(acls, null, '\t')));