在event
传递给我的谷歌云功能才真正告诉我的桶和文件的名称,以及文件是否已被删除.是的,那里还有更多,但似乎没有那么有用:
{ timestamp: '2017-03-25T07:13:40.293Z', eventType: 'providers/cloud.storage/eventTypes/object.change', resource: 'projects/_/buckets/my-echo-bucket/objects/base.json#1490426020293545', data: { kind: 'storage#object', resourceState: 'exists', id: 'my-echo-bucket/base.json/1490426020293545', selfLink: 'https://www.googleapis.com/storage/v1/b/my-echo-bucket/o/base.json', name: 'base.json', bucket: 'my-echo-bucket', generation: '1490426020293545', metageneration: '1', contentType: 'application/json', timeCreated: '2017-03-25T07:13:40.185Z', updated: '2017-03-25T07:13:40.185Z', storageClass: 'STANDARD', size: '548', md5Hash: 'YzE3ZjUyZjlkNDU5YWZiNDg2NWI0YTEyZWZhYzQyZjY=', mediaLink: 'https://www.googleapis.com/storage/v1/b/my-echo-bucket/o/base.json?generation=1490426020293545&alt=media', contentLanguage: 'en', crc32c: 'BQDL9w==' } }
如何获取内容而不仅仅是上传到gs存储桶的新.json文件的元数据?
我尝试使用npm:request()
on event.data.selfLink
,这是存储桶中文件的URL,并获得了授权错误:
"code": 401, "message": "Anonymous users does not have storage.objects.get access to object my-echo-bucket/base.json."
关于阅读存储桶的问题也有类似的问题,但可能在不同的平台上.无论如何,它没有答案:
如何阅读谷歌云存储中的文件的使用JavaScript的内容 `
您需要使用客户端库进行谷歌存储,而不是通过URL访问.request()
只有在文件暴露给公共访问时,才能使用URL.
在包含项目的npm托管目录中导入Google云端存储库.
npm i @google-cloud/storage -S
谷歌云/存储的npm页面有很好的例子,但我必须通过API阅读一下,看看下载到内存的简单方法.
在Google Cloud Functions环境中,您无需向初始化存储提供任何api密钥等.
const storage = require('@google-cloud/storage')();
传递的有关该文件的元数据可用于确定您是否真的想要该文件.
当你想要文件时,你可以使用file.download函数下载它,它可以进行回调,或者缺少回调,将返回一个promise.
但是,数据将作为a返回,Buffer
因此您需要调用data.toString('utf-8')
将其转换为utf-8编码的字符串.
const storage = require('@google-cloud/storage')(); exports.logNewJSONFiles = function logNewJSONFiles(event){ return new Promise(function(resolve, reject){ const file = event.data; if (!file){ console.log("not a file event"); return resolve(); } if (file.resourceState === 'not_exists'){ console.log("file deletion event"); return resolve(); } if (file.contentType !== 'application/json'){ console.log("not a json file"); return resolve(); } if (!file.bucket){ console.log("bucket not provided"); return resolve(); } if (!file.name){ console.log("file name not provided"); return resolve(); } (storage .bucket(file.bucket) .file(file.name) .download() .then(function(data){ if (data) return data.toString('utf-8'); }) .then(function(data){ if (data) { console.log("new file "+file.name); console.log(data); resolve(data); } }) .catch(function(e){ reject(e); }) ); }); };
部署如预期:
gcloud beta functions deploy logNewJSONFiles --stage-bucket gs://my-stage-bucket --trigger-bucket gs://my-echo-bucket
请记住查看Google Cloud Platform上的Stackdriver:Logging页面以获取console.log
条目.
更新:(2017年3月28日).上面的代码天真地假设传输在第一次尝试时完成.目前,ECONNRESET
在尝试使用Google云端功能的Google存储时,会看到相当多的查杀传输.希望这会有所改善,但与此同时......使用npm:promise-retry会有所帮助,因为通常情况下,转移会在下一次尝试之后通过OK npm:promise-retry
.promise-retry默认会尝试多达10次.
上面代码的最新promise-retry版本现在位于npm:maybe-json.为了写,我把npm:pipe-to-storage放在一起,如果一个字符串或一个返回一个新的可读流的函数被用作第一个参数,它将使用promise-retry.