2017-06-20 62 views
0

我正在爲我的webapp使用Firebase的雲端函數。我需要爲上傳到Firebase存儲的任何圖片創建縮略圖。爲此,我需要將上傳的文件從GCS存儲區下載到臨時目錄(使用mkdirp-promise),並應用imageMagick命令創建縮略圖。 (Firebase Function Samples- Generate Thumbnail清理Temp目錄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 
    }); 
}); 

我的問題是:

  1. 在這個temp目錄中創建哪裏?
  2. 這個臨時存儲計入我的Firebase雲存儲或Google雲存儲配額嗎?
  3. 我成功上傳新創建的縮略圖文件後,如何清理我的臨時目錄?所以我的配額不會超過。

回答

1
  1. 臨時目錄中tmpfs,這在雲計算環境的功能保存在內存中創建的。請參閱https://cloud.google.com/functions/pricing#local_disk
  2. 由於tmpfs保留在內存中,因此它會計入功能的內存使用量。
  3. 您可以通過調用fs.rmdir()刪除目錄:https://nodejs.org/api/fs.html#fs_fs_rmdir_path_callback
+0

'fs.rmdir'返回一個承諾?我如何在現有的代碼中使用它? –

+0

另外,我可以訪問或查看我的臨時目錄嗎? –

+0

os.tmpdir是一個普通的目錄。您可以根據需要閱讀或刪除它。如果你不想處理異步,你可以調用'fs.rmdirSync'。否則,有一些簡單的技巧就像我在下面用來將舊的回調API轉換爲Promise API。 –

2

下面是一些我寫在谷歌I/O「賤賣!」持續部署演示(代碼警告:這是在打字稿,沒有JavaScript的。這讓我使用的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); 
    } 
}