Облачные функции для Firebase Storage в Typescript (свойство ref не существует для типа Storage) - PullRequest
0 голосов
/ 14 апреля 2020

Возможно, я слишком долго смотрел на это слишком долго сегодня. У меня есть облачная функция, которая автоматически генерирует эскизы для загруженных изображений. После того, как миниатюра загружена, я хотел бы, чтобы вторая функция получала URL миниатюры и URL исходного объекта, чтобы их можно было сохранить в документе.

Когда я пытаюсь выполнить развертывание, я получаю следующую ошибку: src / index.ts: 28: 29 - ошибка TS2339: свойство 'ref' не существует в типе Storage.

Теперь сообщение довольно ясно, но я действительно понятия не имею, что я должен использовать вместо этого. Большая часть того, что я видел в Интернете, показывает ref () как свойство. Любая помощь будет принята с благодарностью!

Эта проблема находится в // получить старый раздел ниже.

    import * as functions from "firebase-functions";

    import * as admin from "firebase-admin";

    const firebase = admin.initializeApp();

    export const addNewImageToPlantFile = functions.storage.bucket("users/{userID}/plants/{docID}/images").object().onFinalize(async (object, context) => {

//***ON CREATION OF NEW THUMBNAIL, WRITE TO FILE

  //check image name to decide if run

      if (object && object.name && object.name.endsWith('_200x200.jpg')) {

      const {docID} = context.params;

  //get the path of the original image

      const split = object?.name.split('_200x200');

      const pathFull = split.join();

      console.log(pathFull);

  //get the url

      const urlThumb = object.mediaLink;

      console.log(urlThumb);

  //get the old 

      const storage = firebase.storage;

      **const reference = storage.ref();**

      const imageReference = reference.child(pathFull);

      const urlFull = await imageReference.getDownloadURL();

      console.log(urlFull);

  //*****PACK THE DATA AND UPDATE FILE*****//

  //get the time from ID



    const time = Number(docID.split('_')[0]);

  //pack the data

      const data = {
          'date': time,
          'full': urlFull,
          'thumb':urlThumb
      };

  //update document

      return admin.firestore().doc('plants/' + docID).update({
        imageSets: admin.firestore.FieldValue.arrayUnion(data)
      });

      } else {
          console.log('Uploaded image is not a thumbnail (_200x200.jpg)');
          return
      }

//FUNCTION END

    });

1 Ответ

0 голосов
/ 14 апреля 2020

Одна вещь, которую вы должны понять, что использование Firebase Admin SDK с облачным хранилищем, заключается в том, что API не совпадает с клиентским SDK для JavaScript. Администратор Firebase фактически оборачивает API Cloud Storage для nodejs, задокументировано здесь .

Вы, вероятно, просто хотите удалить эти строки:

const storage = firebase.storage;
const reference = storage.ref();

и заменить их на код, который начинается следующим образом:

const imageFile = admin.storage().bucket().file(pathFull);

Обратите также внимание на то, что Cloud SDK (и все бэкэнд-SDK, которые имеют дело с Cloud Storage) не имеют концепции «URL загрузки», как вы видите в клиентских библиотеках. Вам понадобится другой способ создания URL-адреса, использующий подписанный URL-адрес, который обсуждается в этом вопросе: Получить URL-адрес загрузки из файла, загруженного с помощью облачных функций для Firebase

Таким образом, у вас будет продолжить работу, используя imageFile и схему стратегии в ответе на этот вопрос.

...