3

私のGoogleクラウド機能に渡されたeventは、バケツとファイルの名前とファイルが削除されたかどうかを本当に教えてくれます。はい、もっとそこにありますが、それはすべてのことが有用いないようです:クラウド機能内からタイプ.jsonの新しいクラウドストレージファイルの内容を読み取るにはどうすればよいですか?

{ 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ファイルの単なるメタデータを得るのですか?

私はストレージバケット内のファイルのURLである、event.data.selfLinknpm:request()を使用してみました、そしてバック許可エラーを得た:

"code": 401, "message": "Anonymous users does not have storage.objects.get access to object my-echo-bucket/base.json."

SOについての読書ストレージバケット上の同様の質問がありましたおそらく別のプラットフォームで動作します。とにかくそれは、未回答た:

How do I read the contents of a file on Google Cloud Storage using javascript `

+1

注:これは(http://stackoverflow.com/help/self-answer)[自己が質問に答え]されます。うまくいけば、他の人がそれが役に立つと思います。あなたがより良い/クリーナー/短い答えを持っているなら、私はそれを検討します。 – Paul

答えて

5

あなたは、Googleのストレージの代わりに、URLを介してアクセスするためのクライアントライブラリを使用する必要があります。 URLに対してrequest()を使用すると、ファイルが公開アクセスに公開された場合にのみ機能します。

あなたのプロジェクトを含むnpm管理のディレクトリにGoogleクラウドストレージライブラリをインポートします。

npm i @google-cloud/storage -S 

npm page for google-cloud/storageはまともな例がありますが、私はメモリにダウンロードする簡単な方法を確認するためにAPIを介してビットを読み取ることがありました。

Google Cloud Functions環境では、初期設定としてAPIキーなどをストレージに追加する必要はありません。

const storage = require('@google-cloud/storage')(); 

ファイルに渡されたメタデータを使用して、ファイルが本当に必要かどうかを判断できます。

ファイルが必要な場合は、file.download関数を使用してファイルをダウンロードできます。この関数は、コールバックを取るか、コールバックがなくても約束を返します。
しかし、データは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 

はのStackdriverで見て覚えておいてください:ログ・ページをGoogleのクラウドプラットフォーム上でconsole.logエントリを。

更新日:(2017年3月28日)。上記のコードでは、最初の試行で転送が正常に完了したと仮定しています。現在Google Cloud機能からGoogle Storageを使用しようとしたときにかなりの数のECONNRESET転送が行われています。うまくいけば、これは改善されますが、その間にの後の次の試行では、通常npm:promise-retryを使用すると転送が正常に行われます。 promise-retryはデフォルトで最大10回試行されます。

上記のコードの最新の約束再試行版は現在npm:maybe-jsonにあります。私が一緒に投げたのは、文字列または新しい読み込み可能なストリームを返す関数が最初のパラメータとして使用されている場合にpromise-retryを使用するnpm:pipe-to-storageです。

+0

ECONNRESETエラーの修正時に+1。私はcron関数を強制的に1日数回再試行して、すべてのファイルに正しく書き込むようにしなければなりません。 –

1
npm install @google-cloud/storage --production 

package.json:

{ 
    "main": "app.js", 
    "dependencies": { 
    "@google-cloud/storage": "^1.2.1" 
    } 
} 

あなたはnpm lsnpm ERR! missing:のようなエラーが表示されないことを実現する必要があります。

app.js:

... 

    const storage = require("@google-cloud/storage")(); 
    storage. 
    bucket("mybucket"). 
    file("myfile.txt"). 
    download(function(err, contents) { 
     console.log(contents.toString()); 
    }); 
関連する問題