【问题标题】:How can I download and send a file from firebase cloud storage before deletion?如何在删除之前从 Firebase 云存储下载和发送文件?
【发布时间】:2020-07-28 15:07:44
【问题描述】:

这是我当前发送空文件的解决方案。我基本上需要在文件从特定存储桶中删除之前通过电子邮件发送文件

exports.sendBeforeDelete = functions.storage.bucket('reports').object().onDelete(async (object:any) => {
      const fileBucket = object.bucket; 
      if (fileBucket === 'reports') {
        const filePath = object.name;
        if (filePath) {
          const file = await request(`${object.mediaLink}&token=${object.metadata.firebaseStorageDownloadTokens}`);
            const email = example@example.com
            const mailOptions = {
              from: 'example',
              to: email,
              subject: 'Report Deleted',
              text: ` Mail Body
              `,
              attachments: [{
                file
              }
              ]
            };
            transporter.sendMail(mailOptions, function (error: any, info: any) {
              if (error) {
                console.log('error', error);
              } else {
                console.log('Email sent: ' + info.response);
              }
            });

        }
      }
      return Promise.resolve()
    });

我曾尝试仅使用该对象,但似乎从未获得有效文件。

【问题讨论】:

  • 您没有正确处理承诺和异步编程。您有义务返回一个仅在所有异步工作完成后才解决的承诺。您不能只返回Promise.resolve() 自动执行此操作。
  • 你能解释一下为什么这会影响手头文件的检索吗?
  • 函数在任何工作完成之前终止和清理。

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


【解决方案1】:

似乎提供的代码确实没有正确处理承诺和异步编程。异步工作完成后,请尝试返回已解决的承诺。您可以通过使用Await operator 来做到这一点。

当您尝试在异步工作完成之前返回 Promise.resolve 时,此函数在任何工作完成之前终止。

【讨论】:

    【解决方案2】:

    我们发现的问题是文件已经在这个函数上被删除了

    functions.storage.bucket('reports').object().onDelete()

    所以我们不再可以访问它。相反,我们在早上 6 点运行 cronjob 以检查文件是否应在当天被删除,然后发送它而不是在删除文件时发送

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多