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.
