在不使用数据库触发器的情况下,无法使用 firebase 云功能更新 firebase 数据库

Posted

技术标签:

【中文标题】在不使用数据库触发器的情况下,无法使用 firebase 云功能更新 firebase 数据库【英文标题】:Can't update firebase database using firebase cloud functions without using database triggers 【发布时间】:2018-11-06 10:49:50 【问题描述】:

我创建了一个 firebase 函数,用于在进行 API 调用时更新 firebase 数据库中的值。它给出了以下错误。

i  deploying functions
Running command: npm --prefix "$RESOURCE_DIR" run lint

> functions@ lint /home/sumedhe/Project/mobile-atm-server/functions
> tslint --project tsconfig.json


ERROR: /home/sumedhe/Project/mobile-atm-server/functions/src/index.ts[12, 5]: Promises must be handled appropriately

npm ERR! code ELIFECYCLE
npm ERR! errno 2
npm ERR! functions@ lint: `tslint --project tsconfig.json`
npm ERR! Exit status 2
npm ERR! 
npm ERR! Failed at the functions@ lint script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/sumedhe/.npm/_logs/2018-05-27T20_11_58_855Z-debug.log

Error: functions predeploy error: Command terminated with non-zero exit code2

代码

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) 

    // HERE IT GIVES THE ERROR //
    admin.database().ref('/modified').set("yes");
);
exports.api = functions.https.onRequest(app);

但如果我将相同的代码与 firebase 数据库触发器一起使用,效果会很好。

exports.touch = functions.database.ref('/transactions/item').onWrite(
   (change, context) => admin.database().ref('/modified').set("yes"));

【问题讨论】:

请编辑您的问题以显示整个错误。您错过了 lint 错误。 我修改了问题 【参考方案1】:

lint 错误提示:

[12, 5]: Promises must be handled appropriately

这意味着在第 12 行(从 TypeScript 转译的 javascript)你注意到处理一个承诺。以下函数返回一个承诺:

admin.database().ref('/modified').set("yes");

你需要用这个承诺做点什么。鉴于这是一个 HTTP 类型的函数,您应该根据 promise 的结果向客户端发送回一些内容。可能是这样的:

admin.database().ref('/modified').set("yes")
.then(() => 
    res.send('ok')
)
.catch(err => 
    res.status(500).send(err)
)

您想做什么由您决定,但您需要处理来自返回承诺的方法的延续和错误,例如DatabaseReference.set()

【讨论】:

以上是关于在不使用数据库触发器的情况下,无法使用 firebase 云功能更新 firebase 数据库的主要内容,如果未能解决你的问题,请参考以下文章

在不使用提交按钮的情况下触发标准 HTML5 验证(表单)?

如何在不增加成本情况下使用Cloudflare Cron 触发器?

PHP在不使用数组的情况下触发AJAX错误代码

如何在不使用 JButton 的情况下触发 Java 应用程序上的链接

在不提交表单的情况下触发 Google 脚本

如何在不实际拖放的情况下使用 jQuery UI Droppable 触发 Drop 事件?