清理临时目录Firebase云功能

时间:2017-06-20 12:48:30

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

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

2 个答案:

答案 0 :(得分:5)

这里是我为" Fire!sale"编写的一些代码。 Google I / O上的持续部署演示(警告:它在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);
  }
}

答案 1 :(得分:3)

  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
  4. 删除目录