未使用数据库触发器时,无法通过Firebase Cloud Functions更新Firebase数据库
解决Firebase Cloud Functions中TSLint的"Promises must be handled appropriately"错误
咱们来拆解下你遇到的问题:这个TSLint报错的核心原因,是你在async标记的Express路由函数里调用了返回Promise的数据库操作,但没有正确处理这个Promise的状态。
先说说为啥触发器里的代码没问题
在你的touch触发器函数中,你直接返回了admin.database().ref('/modified').set("yes")这个Promise——Firebase Cloud Functions会自动监听这个Promise的完成状态,TSLint也认可这种“返回Promise交由系统处理”的方式,所以不会报错。
再看Express路由里的问题出在哪
你的getUser函数标记了async,但调用set方法时,既没有用await等待这个异步操作完成,也没有返回这个Promise。TSLint会判定你忽略了异步操作的结果,这可能导致未完成的数据库操作、内存泄漏或者隐藏的错误,因此抛出了警告。
两种修复方案任你选
方案1:用await等待异步操作完成
既然函数已经是async的,直接用await等待数据库操作结束,之后再给客户端返回响应:
import * as express from "express"; import * as admin from "firebase-admin"; import * as functions from "firebase-functions"; const app = express(); admin.initializeApp(); app.get("/mytransactions/", async function getUser(req: express.Request, res: express.Response) { // 用await等待数据库修改完成 await admin.database().ref('/modified').set("yes"); // 操作完成后返回成功响应 res.status(200).send("数据库值已更新"); }); exports.api = functions.https.onRequest(app);
方案2:通过Promise的then/catch处理结果
如果你不想用await,也可以手动监听Promise的状态,在成功时返回响应,失败时捕获错误:
import * as express from "express"; import * as admin from "firebase-admin"; import * as functions from "firebase-functions"; const app = express(); admin.initializeApp(); app.get("/mytransactions/", function getUser(req: express.Request, res: express.Response) { admin.database().ref('/modified').set("yes") .then(() => { res.status(200).send("数据库值已更新"); }) .catch((error) => { // 捕获并返回错误信息 res.status(500).send(`更新失败:${error.message}`); }); }); exports.api = functions.https.onRequest(app);
额外小提醒
不管选哪种方案,都别忘了处理错误情况——数据库操作可能因为权限、网络等问题失败,及时捕获并返回错误信息,能让你的API更健壮,也方便客户端排查问题。
内容的提问来源于stack exchange,提问作者sumedhe
相关产品推荐
相关产品推荐

