firebase - Hur man uppdaterar en karta i Firestore inom en cloudFunction kodad med TypeScript


Jag vill uppdatera en karta i Firestore med en molnfunktion skriven i Typescript, så jag gjorde denna kod men den fungerar inte:

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';

admin.initializeApp(functions.config().firebase);
exports.sendNote = functions.https.onCall(async(data,context)=>{
const numeroSender: string = data['numeroSender'];
const amisA = admin.firestore().collection('Amis').doc(numeroReceiver);
const connaissanceABBA:number = 3.0;
const version:number = 1;
await amisA.update({
           'amis.${numeroSender}' : [connaissanceABBA,version]
        });
});

redigeraren ersätter inte numeroSender med dess värde, och jag försökte också med:

'amis.'+numeroSender

och redigeraren frågar efter ett semikolon och visar många andra fel. Även jag försökte prova på detta sätt:

const mapA: string = ("amis."+numeroSender);
console.log(mapA);
await amisA.update({
            mapA : [connaissanceABBA,version]
        });

konsolen visar rätt sträng, men uppdateringsfunktionen läser inte värdet av mapA utan kör med strängen 'mapA'.

Svar #1

Du kan göra:

await amisA.update({
      [`amis.${numeroSender}`] : [connaissanceABBA, version]
});

I ES6 (och därför även i TypeScript) kan du använda ComputedPropertyName som visas i språkets specifikation: http://www.ecma-international.org/ecma-262/6.0/#sec-object-initializer

Observera att i ES5 skulle du behöva göra på följande sätt, genom att använda hakparentesnotationen:

var obj = {};
obj[`amis.${numeroSender}`] = [connaissanceABBA, version]; 
amisA.update(obj);

Observera också att detta kommer att fungera som förväntat med update()-metoden eftersom "fält kan innehålla punkter för att referera till inbäddade fält inom dokumentet". Dock kan det resulterande objektet i JavaScript-koden inte vara exakt vad du förväntar dig. Du kan se det genom att göra:

var obj1 = {
          [`amis.${numeroSender}`] : [connaissanceABBA, version]
    }
console.log(JSON.stringify(obj1));

Slutligen, notera att template-literals är omgivna av backticks, som:

`amis.${numeroSender}`

och inte som:

'amis.${numeroSender}'

som visas i din fråga.

Relaterade artiklar