【问题标题】:How to update a map in Firestore within cloudFunction coded with TypeScript如何使用 TypeScript 使用云函数代码更新 Firestore 中的地图
【发布时间】:2019-10-24 10:34:47
【问题描述】:

我想使用在 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' 执行。

【问题讨论】:

    标签: typescript firebase google-cloud-firestore google-cloud-functions


    【解决方案1】:

    你可以这样做:

    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));
    

    最后注意template literals 用反引号括起来,例如:

    `amis.${numeroSender}`
    

    不喜欢:

    'amis.${numeroSender}'
    

    如您的问题所示。

    【讨论】:

    • 你成就了我的一天!我还有一个问题。当我尝试在值数组中或通过 const 插入 admin.firestore.FieldValue.serverTimestamp() 时,我收到此错误:**错误:Update() 需要单个 JavaScript 对象或字段/值对的交替列表,后面可以跟可选的前提条件。参数“dataOrField”的值不是有效的 Firestore 值。 FieldValue.serverTimestamp() 不能在数组内部使用(在字段 amis.+33651177261.0 中找到)。**
    • 你能不能写一个全新的问题来说明你如何将admin.firestore.FieldValue.serverTimestamp() 传递给update() 方法。显然你得到一个错误“FieldValue.serverTimestamp() 不能在数组中使用”
    • @JeevaCanessane 查看我的回答。
    猜你喜欢
    • 2020-11-22
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多