Создайте файл в облачном хранилище из триггера - PullRequest
1 голос
/ 25 марта 2020

Я бы хотел иметь возможность создать файл в Bucket проекта как часть облачного триггера Firestore.

Когда есть изменение в документе в указанной коллекции c, мне нужно быть возможность взять данные из этого документа и записать их в файл в хранилище в облачном хранилище. Пример

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] (в безопасном месте, но доступном для аутентифицированных пользователей), представляющий этот заказ на покупку. Данные для его создания будут получены из документа, который инициирует изменение.

1 Ответ

0 голосов
/ 26 марта 2020

Как сказал @Doug Stevenson, вы можете использовать потоки узлов.

Вы можете увидеть, как это сделать, в этом примере из репозитория GCP для начала работы . Вам необходимо указать имя файла и буфер файла, чтобы передать его в 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...