【问题标题】:Cleanup Temp Directory Firebase cloud Functions清理临时目录 Firebase 云函数
【发布时间】:2017-11-23 00:37:06
【问题描述】:

我正在为我的 web 应用程序使用 Cloud Functions for Firebase。我需要为上传到 Firebase 存储的任何图像创建缩略图。为此,我需要将上传的文件从 GCS 存储桶下载到临时目录(使用 mkdirp-promise),然后应用 imageMagick 命令创建缩略图。 (Firebase Function Samples- Generate Thumbnail)

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. 成功上传新创建的缩略图文件后,如何清理临时目录?这样我的配额就不会超过。

【问题讨论】:

    标签: firebase firebase-storage google-cloud-functions


    【解决方案1】:
    1. temp 目录在tmpfs 中创建,在 Cloud Functions 环境中保存在内存中。见https://cloud.google.com/functions/pricing#local_disk
    2. 由于tmpfs 保存在内存中,它会计入函数的内存使用量。
    3. 您可以通过调用fs.rmdir() 删除目录:https://nodejs.org/api/fs.html#fs_fs_rmdir_path_callback

    【讨论】:

    • fs.rmdir 是否返回承诺?如何在现有代码中使用它?
    • 另外,我可以访问或查看我的临时目录吗??
    • os.tmpdir 是一个普通目录。您可以根据需要阅读或删除它。如果不想处理异步,可以拨打fs.rmdirSync。否则有一些简单的技巧,比如我在下面使用的将旧的回调 API 转换为 Promise API。
    【解决方案2】:

    这是我在 Google I/O 上为“Fire!sale”持续部署演示编写的一些代码(警告:它使用 TypeScript,而不是 JavaScript。这让我可以使用更易于阅读的 await/async,尤其是在错误处理的案例)

    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);
      }));
    }
    

    然后在我的 Cloud Functions 代码中,我可以执行以下操作:

    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);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-29
      • 2022-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-11
      • 2021-11-01
      • 1970-01-01
      相关资源
      最近更新 更多