确定文件是被删除还是被覆盖-Firebase Storage OnDelete()

时间:2018-07-25 01:08:54

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

除了调用OnDelete()之外,是否有其他方法可以确定在触发file.exists()时文件是否确实被删除或是否已被更新(覆盖)?

已知

OnDelete()是在文件被删除或覆盖时触发的-这是一种预期的行为,如documentation中所述。

当用户删除个人资料照片时,我在应用程序中使用它。因此,在触发时,我无法确定图片是删除还是更新,因为在两种情况下都会触发。所以我必须手动检查发生了什么,这正是我的问题。

我显然可以使用file.exists()来完成这项工作,但是我认为这是一个昂贵的电话(还是我错了吗?),因为这再次访问了存储,并且看来必须有一种避免它的方法。 ,但我不确定。

如果没有办法,我是否可以安全地假设exists()永远不会在覆盖事件之前发生,从而导致错误的否定? (我担心它会在覆盖完成之前运行,找不到现有文件,然后返回false)。

2 个答案:

答案 0 :(得分:1)

根据documentation,如果您使用版本存储桶,则OnDelete()仅在“版本被永久删除时(但在归档对象时不会”时)触发。 “。

为了将您的存储桶转换为版本控制桶,请遵循以下文档:https://cloud.google.com/storage/docs/using-object-versioning#enable

答案 1 :(得分:1)

我的不使用版本控制的解决方案(用Go编写,但其原理保持不变):

func main(ctx context.Context, event GCSEvent) error {
    obj := bucket.Object(event.Name)
    _, err = obj.Attrs(ctx) // _ => objAttrs
    if err != nil {
        if err.Error() == "storage: object doesn't exist" {
            // This file is deleted, so execute a function
            onFileDeleted()
            return nil
        } else {
            // Something else went wrong, identify it
            log.Fatalf("Getting attributes error: %v", err, e.Name[7:27])
        }
    }
    // This means file was merely updated
    return nil
}

func onFileDeleted() {
  log.Println("File deleted")
}

简短说明:

  1. 基于文件名,首先获取对该对象的引用。
  2. 从对象的引用中,尝试读取属性。
  3. 如果遇到错误,请检查该错误是否是由于文件不存在。
  4. 如果错误正确无误,请在删除文件 时执行所需的操作。