更新CloudFunctions上的子集合

时间:2019-11-01 01:53:10

标签: node.js firebase google-cloud-firestore google-cloud-functions

我需要帮助。

我的项目中有2个集合,一个叫做“产品”,另一个叫做“用户”。

我正在将所选产品信息复制到用户的子集合中作为收藏夹,在这种情况下:

用户(收藏)>用户(文档)>收藏夹(收藏)>产品(文档)

我的想法是创建一个云函数,该函数将监视“产品集合”产品(集合)>产品(文档)中任何产品的任何更新,然后将这些更改反映在用户>收藏夹子集合上在此处更新产品的价值:

用户(收藏)>用户(文档)>收藏夹(收藏)>产品(文档)

如何从index.js做到这一点?这是我的代码:

    static string EncryptStringToBytes(string plainText, byte[] key)
    {
        byte[] encrypted;
        using (RijndaelManaged rijAlg = new RijndaelManaged())
        {
            rijAlg.Key = key;
            // rijAlg.IV = ???
            rijAlg.GenerateIV();
            rijAlg.Padding = PaddingMode.PKCS7;
            rijAlg.Mode = CipherMode.CBC;
            ICryptoTransform encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV);
            using (MemoryStream msEncrypt = new MemoryStream())
            using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
            using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
            {

                swEncrypt.Write(plainText);
                if (plainText.Length < 16)
                {
                    for (int i = plainText.Length; i < 16; i++)
                        swEncrypt.Write((byte)0x0);
                }
                swEncrypt.Flush();
                csEncrypt.FlushFinalBlock();
                encrypted = msEncrypt.ToArray();
            }
        }
        return Convert.ToBase64String(encrypted);
    }

2 个答案:

答案 0 :(得分:1)

我终于弄清楚了如何使用嵌套允诺。解决方法如下:

exports.updateFavoritedProducts = functions.firestore.document('products/{productId}').onUpdate((change, context) => {
    const data = change.after.data();
    const productID = data.id;

 return db.collection('products').where('id', '==', productID).get().then((productsQuerySnap) => {

    productsQuerySnap.forEach((productQuerySnap) => {
        const newPrice = productQuerySnap.data().price;
        const newPriceUnit = productQuerySnap.data().priceUnit;

        db.collection('users').get().then((usersQuerySnap) => {
            usersQuerySnap.forEach((userQuerySnap) => {

                return db.collection('users').doc(userQuerySnap.id).collection('favorites').doc(productQuerySnap.id).update({ 
                    price: newPrice,
                    priceUnit : newPriceUnit

                 }).catch((err) => {
                    console.log('Error getting documents', err);
                    return Promise.reject(err);
                    });
                });
                return null
            })
            .catch((err) => {
                console.log('Error getting documents', err);
                return Promise.reject(err);
            });
        return null
    });
    return null
})
    .catch((err) => {
        console.log('Error getting documents', err);
        return Promise.reject(err);
    });
});

答案 1 :(得分:0)

如果您要创建可为所有用户触发所有产品更新的Cloud Function,请将其声明为:

functions.firestore.document('users/{userId}/products/{productId}').onUpdate((change, context) => {

如果您随后要访问函数体内的userIdproductId,则可以通过以下方式获取它们:

context.params.userId
context.params.productId