我需要帮助。
我的项目中有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);
}
答案 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) => {
如果您随后要访问函数体内的userId
或productId
,则可以通过以下方式获取它们:
context.params.userId
context.params.productId