TypeScript版Firebase Cloud Functions返回成功但实时数据库无更新,JS版正常
问题根因
- 核心错误:Firebase Realtime Database 的
update()方法仅支持普通JavaScript对象作为批量更新参数,不支持ES6Map类型。你从JS切换到TS时把原来的普通对象改成了Map,导致update方法接收到无法识别的参数,底层直接忽略了更新操作,所以不会报错也不会写入数据。 - 次要笔误:写入
bar到用户路径时缺了斜杠,原代码写的是${userPath}bar,实际应该是${userPath}/bar,就算update正常工作这个字段也会写到错误层级。
修复方案
把Map替换成普通TS对象即可,修改后的代码如下:
import * as functions from "firebase-functions"; import * as admin from "firebase-admin"; admin.initializeApp(); exports.createItemWithVIP = functions.region("europe-west1") .https.onCall((data, context) => { // 鉴权校验 if (!context.auth) { console.log("Unauthenticated request"); throw new functions.https.HttpsError("permission-denied", "你没有权限执行该操作"); } // 读取传入参数 const foo = data.foo; const bar = data.bar; console.log(`foo: ${foo}, bar: ${bar}`); const userUID = context.auth.uid; console.log(`userUID: ${userUID}`); const db = admin.database(); // 生成新item的唯一ID const somePathTableReference = db.ref("somePath/").push(); // 更优雅的获取push生成的ID方式,不需要手动切割字符串 const itemUID = somePathTableReference.key as string; console.log(`itemUID: ${itemUID}`); const itemPath = `somePath/${itemUID}`; const userPath = `users/${userUID}/somePath/${itemUID}`; // 替换Map为普通对象,符合update方法的参数要求 const updateMap: Record<string, unknown> = {}; updateMap[`${itemPath}/vip/${userUID}`] = true; updateMap[`${itemPath}/foo`] = foo; updateMap[`${itemPath}/bar`] = bar; updateMap[`${userPath}/role`] = "vip"; updateMap[`${userPath}/foo`] = foo; // 修复路径缺斜杠的笔误 updateMap[`${userPath}/bar`] = bar; // 打印校验所有更新路径 Object.entries(updateMap).forEach(([key, value]) => console.log(key, value)); return db.ref("/").update(updateMap).then(() => { console.log(`新增item成功,ID: ${itemUID};已为用户 ${userUID} 添加vip权限`); return {"message": "Success"}; }).catch((e) => { console.log(`Error: ${e}`); throw new functions.https.HttpsError("unknown", "发生未知错误"); }); });
额外优化建议
- 原来获取itemUID的方式可以直接用
push().key获取,不需要把reference转成字符串再切割,更稳妥不会因为路径修改出问题。 - 可以开启TS的严格类型校验,给入参
data定义接口类型,避免后续传入非法参数。 - 可以提前校验
foo和bar是否存在,避免写入空值到数据库。
内容的提问来源于stack exchange,提问作者paj-co
相关产品推荐
相关产品推荐

