我想使用在Typescript中键入的cloud Function更新Firestore中的地图,所以我编写了这段代码,但是它不起作用:
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]
});
});
编辑器不会用其值替换numeroSender,我也尝试使用:
'amis.'+numeroSender
并且编辑器正在询问分号并显示许多其他错误。 甚至我也尝试过这种方式:
const mapA: string = ("amis."+numeroSender);
console.log(mapA);
await amisA.update({
mapA : [connaissanceABBA,version]
});
控制台显示正确的字符串,但更新功能不会读取mapA值,而是使用字符串'mapA'执行。
答案 0 :(得分:1)
您可以这样做:
"3"
在ES6中(因此也在TypeScript中),您可以使用 ComputedPropertyName ,如语言规范中所示:http://www.ecma-international.org/ecma-262/6.0/#sec-object-initializer
请注意,在ES5中,必须使用方括号表示法执行以下操作:
await amisA.update({
[`amis.${numeroSender}`] : [connaissanceABBA, version]
});
还要注意,这将与update()
方法一起使用,因为“字段可以包含点以引用文档中的嵌套字段”。但是,JavaScript代码中生成的对象可能与您期望的不完全相同。您可以通过以下方式查看它:
var obj = {};
obj[`amis.${numeroSender}`] = [connaissanceABBA, version];
amisA.update(obj);
最后请注意,template literals用反引号括起来,例如:
var obj1 = {
[`amis.${numeroSender}`] : [connaissanceABBA, version]
}
console.log(JSON.stringify(obj1));
而不是:
`amis.${numeroSender}`
如您的问题所示。