Firebase: как создать или получить доступ к карте в typescript / облачной функции

#typescript #firebase #google-cloud-functions

#typescript #firebase #google-cloud-функции

Вопрос:

У меня есть карта внутри моего документа. Давайте просто назовем это map. Структура выглядит следующим образом

 -document
   -map
      {id: number}
      {id2: number2}
  

Теперь при первом выполнении функции существует только документ, и я хочу создать карту с первой записью.

Перед первым выполнением

 -document
  

После первого выполнения

 -document
   -map
      {id: number}
  

Теперь всякий раз, когда это выполняется с id, я увеличиваю число, хранящееся внутри карты

Но если идентификатор отсутствует внутри карты, он вставляется.

Например, вызов его с id2 приведет к структуре, показанной в начале.

 await admin.firestore().runTransaction(async t => {
   const documentDb= await admin.firestore().doc(`document/${documentId}`).get()
   const document= documentDb.data()!
   if (document.map === undefined || document.map[id] === undefined) {
      const tempMap = {}; 
      tempMap[id] = 1
      document.map = tempMap
   }else{
      document.map[id] = document.map[id] 1
   }
   t.update(documentDb.ref, document);
}
  

Это не работает (ну, на самом деле это даже не компилируется. Typescript жалуется здесь tempMap[id] = 1 из-за неявного типа «any». Как я могу выполнить эту (ну, я думаю, действительно простую) задачу?

Ответ №1:

const tempMap : { [key: string]: any } = {} должно помочь решить вашу проблему «любого» типа.

Кроме того, обратите внимание, что вы не должны делать documentDb = await admin.firestore().doc(`document/${documentId}`).get() , чтобы получить документ, но использовать get() метод транзакции:

 const documentRef = admin.firestore().doc(`document/${documentId}`);
const snapshot = await t.get(documentRef);
const document= snapshot.data()!;
//...
  

Обновление: как обновить карту

 const id = ...;
const updatePath = 'map.'   id;    // or id.toString(10) 
const obj = {};
obj[updatePath] = document.map[id]   1;
t.update(documentDb.ref, obj);
  

Комментарии:

1. Спасибо. Проблема с любым типом исчезла. Что касается другой проблемы: я сделал ту же ошибку раньше, вы просто избавили меня от проблем. Я также исправил вторую проблему, которая возникла из исходного кода, но я упростил ее для SO. Я проверю это сейчас. Я только что понял, что код не может работать, поскольку он переопределяет карту, если карта уже есть, но добавляется только новый идентификатор.