首页 > 解决方案 > 如何在使用 TypeScript 编码的 cloudFunction 中更新 Firestore 中的地图

问题描述

我想使用在 Typescript 中输入的云函数更新 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”执行。

标签: typescriptfirebasegoogle-cloud-firestoregoogle-cloud-functions

解决方案


你可以做:

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

在 ES6 中(因此也在 TypeScript 中)您可以使用ComputedPropertyName,如语言规范中所示:http: //www.ecma-international.org/ecma-262/6.0/#sec-object-initializer


请注意,在 ES5 中,您必须使用方括号表示法执行以下操作:

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

另请注意,这将按预期使用该update()方法,因为“字段可以包含点以引用文档中的嵌套字段”。但是,JavaScript 代码中的结果对象可能并不完全符合您的预期。您可以通过执行以下操作来查看它:

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

最后请注意,模板文字用反引号括起来,例如:

`amis.${numeroSender}`

不喜欢:

'amis.${numeroSender}'

如您的问题所示。


推荐阅读