#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. Я проверю это сейчас. Я только что понял, что код не может работать, поскольку он переопределяет карту, если карта уже есть, но добавляется только новый идентификатор.