2017-06-20 9 views
0

私はFireAPI用にクラウド機能を使用しています。 Firebase Storageにアップロードされた画像のサムネイルを作成する必要があります。そのためには、アップロードされたファイルをGCSバケットからtempディレクトリ(mkdirp-promiseを使用)にダウンロードし、imageMagickコマンドを適用してサムネイルを作成する必要があります。 (Firebase Function Samples- Generate Thumbnailクリーンアップ時のディレクトリFirebaseクラウドの機能

return mkdirp(tempLocalDir).then(() => { 
    console.log('Temporary directory has been created', tempLocalDir); 
    // Download file from bucket. 
    return bucket.file(filePath).download({ 
     destination: tempLocalFile 
    }); 
    }).then(() => { 
    //rest of the program 
    }); 
}); 

、私の質問は:このtempディレクトリが作成され

  1. この一時ストレージは、FirebaseクラウドストレージまたはGoogleクラウドストレージクォータに対してカウントされていますか?
  2. 新しく作成したサムネイルファイルを正常にアップロードしたら、一時ディレクトリをクリーンアップするにはどうすればよいですか?私のクォータがそれを超えないように。

答えて

1
  1. 一時ディレクトリは、クラウド機能環境でメモリに保持されtmpfs、中に作成されます。 https://cloud.google.com/functions/pricing#local_disk
  2. tmpfsはメモリ内に保持されているため、関数のメモリ使用量がカウントされます。
  3. あなたはfs.rmdir()を呼び出すことによってディレクトリを削除します。それは活字体でだ、ではないのJavaScript:https://nodejs.org/api/fs.html#fs_fs_rmdir_path_callback
+0

'fs.rmdir'は約束を返しますか?既存のコードでどのように使用できますか? –

+0

また、アクセスできますか、私の一時ディレクトリを見ることができますか? –

+0

os.tmpdirは通常のディレクトリです。あなたはそれを読んだり、削除したりすることができます。非同期に対処したくない場合は、 'fs.rmdirSync'を呼び出すことができます。それ以外の場合は、古いCallback APIをPromise APIに変換するために以下のような単純な使い方があります。 –

2

をここに私はGoogleのI/O(警告で「!ファイヤーセール」の連続展開のデモのために書いたコードの一部です。これは、私は、次のような何かを行うことができ、私のクラウド機能のコード内で続い)特にエラー処理の場合には、読みやすくしているのawait /非同期

import * as fs from 'fs'; 
import * as os from 'os'; 
import * as path from 'path'; 
let tempy = require('tempy'); // No .d.ts 

function rmFileAsync(file: string) { 
    return new Promise((resolve, reject) => { 
    fs.unlink(file, (err) => { 
     if (err) { 
     reject(err); 
     } else { 
     resolve(); 
     } 
    }) 
    }) 
} 

function statAsync(file: string): Promise<fs.Stats> { 
    return new Promise((resolve, reject) => { 
    fs.stat(file, (err, stat) => { 
     if (err) { 
     reject(err); 
     } else { 
     resolve(stat); 
     } 
    }) 
    }) 
} 

async function rmrfAsync(dir: string) { 
    // Note: I should have written this to be async too 
    let files = fs.readdirSync(dir); 

    return Promise.all(_.map(files, async (file) => { 
    file = path.join(dir, file); 
    let stat = await statAsync(file); 
    if (stat.isFile()) { 
     return rmFileAsync(file); 
    } 
    return rmrfAsync(file); 
    })); 
} 

を使用することができます:

export let myFunction = functions.myTrigger.onEvent(async event => { 
    // If I want to be extra aggressive to handle any timeouts/failures and 
    // clean up before execution: 
    try { 
    await rmrfAsync(os.tmpdir()); 
    } catch (err) { 
    console.log('Failed to clean temp directory. Deploy may fail.', err); 
    } 

    // In an async function we can use try/finally to ensure code runs 
    // without changing the error status of the function. 
    try { 
    // Gets a new directory under /tmp so we're guaranteed to have a 
    // clean slate. 
    let dir = tempy.directory(); 
    // ... do stuff ... 
    } finally { 
    await rmrfAsync(dir); 
    } 
} 
関連する問題