如何避免在云存储事件中对文件夹执行Firebase功能

时间:2018-07-01 11:13:26

标签: node.js firebase firebase-storage

我正在尝试将资产(图像)组织到每个资产具有唯一ID的文件夹中,原因是每个资产将具有多种格式(缩略图,以及针对Web和不同视口进行了优化的格式)。

因此,对于我上传到文件夹assets-temp/的每项资产,然后通过函数将其移动并重命名为assets/{unique-id}/original{extension}

示例:assets-temp/my-awesome-image.jpg应该变成assets/489023840984/original.jpg

注意:我还将在数据库和原始文件的元数据中跟踪文件的原始名称。

问题:该函数可以运行并执行我想要的操作,但是它还会添加一个名为assets/{uuid}/original/的文件夹,其中没有任何内容...

功能:

exports.process_new_assets = functions.storage.object().onFinalize(async (object) => {
  // Run this function only for files uploaded to the "assets-temp/" folder.
  if (!object.name.startsWith('assets-temp/')) return null;

  const file = bucket.file(object.name);
  const fileExt = path.extname(object.name);
  const destination = bucket.file(`assets/${id}/original${fileExt}`);
  const metadata = {
    id,
    name: object.name.split('/').pop()
  };

  // Move the file to the new location.
  return file.move(destination, {metadata});
});

2 个答案:

答案 0 :(得分:1)

猜测,如果上传原始图像的操作触发两个单独的事件,则可能会发生这种情况:一个创建目录资产临时目录,另一个创建文件资产临时目录/ my- awesome-image.jpg。

如果我猜对了,则第一个操作将使用目录对象(名为"assets-temp/")触发您的函数。这与您的第一个if相匹配,因此代码可以继续执行

destination = bucket.file('assets/${id}/original') // fileExt being empty

然后调用file.move-这将创建assets/id/original/目录。

只需改善您的“如果”,即可排除名为“ assets-temp /”的文件。

答案 1 :(得分:0)

根据documentation,云存储中没有文件夹之类的东西,但是可以像使用控制台GUI一样模拟它们。创建文件夹时,真正发生的事情是创建了一个空对象(零字节空间),但其名称以正斜杠结尾,文件夹名称也可以以_$folder$结尾,但据我所知,这就是工作方式在较旧的版本中,因此对于较新的存储桶而言,正斜杠就足够了。