Firebase云函数动态ID字段更新异常:字符串参数未解析
问题描述
在Firebase Cloud Functions中尝试通过存储在const变量中的动态ID,使用点符号更新Firestore对应字段时遇到两个问题:
- 使用双引号包裹键名时,变量未被解析,Firestore创建了以字面字符串
badges.${ObjectId}.badgeName为键的新字段(对应截图:字段错误创建截图)。 - 将双引号替换为反引号后,出现语法错误(对应截图:语法错误截图)。
相关代码如下:
exports.badgeUpdated = functions.firestore.document("badges/{docId}").onUpdate(async (change, context ) => { const ObjectId = change.after.id; const newObject = change.after.data(); const newBadgeName = newObject.badgeName; console.log(`New BadgeName ${newBadgeName}`); console.log(`New BadgeID ${ObjectId}`); const querySnapshot = await admin.firestore().collectionGroup("keekzCards").where("badgeContains", "array-contains", ObjectId).get(); querySnapshot.forEach((doc) => { doc.ref.update({"badges.${ObjectId}.badgeName": newBadgeName}); console.log(doc.id); }); return null; });
解决方案
要在JavaScript对象字面量中使用动态键名,必须用方括号语法包裹动态生成的键,以此让JavaScript正确解析变量。以下是两种可行的修改方式:
方式一:模板字符串+方括号直接拼接
直接用模板字符串生成字段路径,并用方括号包裹作为对象键:
querySnapshot.forEach((doc) => { doc.ref.update({ [`badges.${ObjectId}.badgeName`]: newBadgeName }); console.log(doc.id); });
方式二:先拼接字段路径字符串
先将完整的字段路径拼接为字符串,再用方括号作为对象键:
querySnapshot.forEach((doc) => { const fieldPath = `badges.${ObjectId}.badgeName`; doc.ref.update({ [fieldPath]: newBadgeName }); console.log(doc.id); });
两种写法都会正确解析ObjectId变量,生成类似badges.xxx123.badgeName的合法嵌套字段路径,从而精准更新Firestore中对应的字段。
内容的提问来源于stack exchange,提问作者SRel
相关产品推荐
相关产品推荐

