从触发器内部在云存储桶中创建文件

问题描述 投票:1回答:1

我希望能够作为Firestore云触发器的一部分在项目Bucket中创建文件。

[当特定集合上的文档发生更改时,我需要能够从该文档中获取数据并将其写入云存储桶中的文件中范例

exports.myFunction = functions.firestore
  .document('documents/{docId}')
  .onUpdate((change, context) => {
    const after = change.after.data() as Document;
    // CREATE AND WRITE TO file IN BUCKET HERE
});

我发现了许多有关如何上传文件的示例。我已经探索过

  • admin.storage().bucket().file(path)
  • createWriteStream()
  • write()

但是我似乎找不到有关如何准确实现上述目标的文档。

是否有可能在触发器中找到,如果可以,我在哪里可以找到有关此操作的文档?

这就是为什么我要这样做(以防万一我走错了路)。我们有一个应用程序,用户可以在其中为他们完成的工作生成采购订单。在他们从软件启动生成时,我们需要创建带时间戳的文档[pdf](在安全的位置,但经过身份验证的用户可以访问该文档)来表示该采购订单。创建数据的数据将来自触发更改的文档。

javascript firebase google-cloud-firestore google-cloud-functions google-cloud-storage
1个回答
0
投票

正如@Doug Stevenson所说,可以使用节点流。

您可以从GCP getting started samples repo的示例中了解如何执行此操作。您需要提供文件名和文件缓冲区,以便将其流式传输到GCS:

function sendUploadToGCS(req, res, next) {

  if (!req.file) {
    return next();
  }

  const gcsname = Date.now() + req.file.originalname;
  const file = bucket.file(gcsname);

  const stream = file.createWriteStream({
    metadata: {
      contentType: req.file.mimetype,
    },
    resumable: false,
  });

  stream.on('error', err => {
    req.file.cloudStorageError = err;
    next(err);
  });

  stream.on('finish', async () => {
    req.file.cloudStorageObject = gcsname;
    await file.makePublic();
    req.file.cloudStoragePublicUrl = getPublicUrl(gcsname);
    next();
  });

  stream.end(req.file.buffer);
}
© www.soinside.com 2019 - 2024. All rights reserved.