【问题标题】:Not able to read Firebase from functions using AdminSDK无法使用 Admin SDK 从函数中读取 Firebase
【发布时间】:2018-07-09 17:16:05
【问题描述】:

由于我在项目中使用了ExpressJs,它可能会造成混淆。对我来说效果很好,我关注了 thisthis 链接。我的疑问非常简单。如何通过 HTTP 触发器从云函数访问 Firebase Realtime DB?

到目前为止的效果:

  • 我可以在函数中使用ExpressJs 并同时执行 POST 和 GET 要求。我可以同时发送 JSON/纯文本响应。

  • admin SDK 的初始化似乎没有引发任何错误。

我的函数代码如下:

//use express
const express = require("express")
//get firebase functions
var functions = require('firebase-functions');
//get firebase admin sdk
const admin = require('firebase-admin');

/* Admin SDK */
admin.initializeApp(functions.config().firebase);

/* Express */
const ss = express()

let bodyParser = require("body-parser")
ss.use(bodyParser.json())
ss.use(bodyParser.urlencoded({ extended: false }))

//When accessing the url http://localhost:5000/proj-b5d88/us-central1/api/, I am getting the response below.
ss.get("/", (request, response) => {
  response.send("Hello from Express on Firebase!")
})
//When accessing the url http://localhost:5000/proj-b5d88/us-central1/api/test, this request doesn't go through and returns the error.
ss.get("/test", (request, response) => {


    var result =  admin.database().ref('test/1').once('value', (snapshot) => {
        var r = snapshot.val();
        var rs = JSON.stringify(r);
        res.send(`
            <!doctype html>
            <html>
                <head>
                    <title>test</title>
                </head>
                <body>
                    <h1>Title ${ rs } </h1>
                </body>
            </html>`
        );
     });


  response.send(result);
})

const api = functions.https.onRequest(ss)

module.exports = {
  api
}

基本网址有效并返回“Hello from Express on Firebase!”,但连接到 firebase 的网址却没有。它返回以下错误。

{"error":{"code":500,"status":"INTERNAL","message":"function crashed","errors":["connect ECONNREFUSED 127.0.0.1:65373"]}}

更新: 对我来说,http 触发器工作正常。抛出错误的部分如下:

  var result =  admin.database().ref('test/1').once('value', (snapshot) => {
        var r = snapshot.val();
        var rs = JSON.stringify(r);
        res.send(`
            <!doctype html>
            <html>
                <head>
                    <title>test</title>
                </head>
                <body>
                    <h1>Title ${ rs } </h1>
                </body>
            </html>`
        );
     });

注意:

我正在通过 HTTP 触发器触发该功能。当用户访问 URL 时,我想在 Drupal 上做一些操作。

  1. 函数会自动从项目中选择数据库吗?我没有在任何地方指定这样的配置。

  2. 我在 localhost firebase serve --only functions 中使用以下命令运行 firebase 函数。这会是个问题吗?

【问题讨论】:

  • 你想在这里完成什么?您没有为部署指定任何触发器。您不能只在 Cloud Functions 上运行任意节点代码。 Cloud Functions 工作的唯一方式是通过触发对项目更改或传入 HTTP 请求的响应。
  • /test 是一个 http 端点。我正在尝试在收到 http 请求时更改一些值。我收到了 http 请求并且能够给出响应。但是我无法从 firebase 读取数据。
  • 是的,这就是我在回答中所说的。
  • @DougStevenson 我进一步更新了我的问题。我不明白我访问 Firebase 的方式有什么问题。我应该在引用 DB 之前定义我的项目、密钥或其他内容吗?我认为它已经被项目本身照顾了。

标签: javascript firebase firebase-realtime-database google-cloud-functions


【解决方案1】:

您不能使用第三方软件在 Cloud Functions 中侦听传入的 HTTP 请求(或任何类型的请求)。如果要创建 API 端点,则需要 write an HTTP trigger。有很多这样做的例子,您也可以使用 Express 在该端点上设置路由。

【讨论】:

  • 我认为我对 expressjs 的使用是混乱的根源。我正在通过 ExpressJs 使用 http 触发器。我同样关注了这个网址:codeburst.io/…。这一切都为我工作。我的疑问主要在于如何在 http 触发器调用函数后访问/修改 firebase 数据库。 Http 触发器工作正常。
  • 您从未在代码中定义过 HTTPS 函数。它永远不会像所示的那样工作。您提供的链接都显示了使用 SDK 定义的 HTTPS 功能。请改用这些模式。您不能使用 express 侦听某个端口 - 这就是您收到显示的错误消息的原因。它与数据库无关。
  • 原谅我的无知。我不明白这个问题。对我来说,如果我在通过浏览器访问 url 时只返回一些文本,我会收到对 http 请求的响应。只有当我添加 db ref 来获取数据时才会出现错误。
  • 请编辑您的问题以显示您如何定义 HTTP 触发器。正如它现在显示的那样,没有。从这里的文档开始:firebase.google.com/docs/functions/http-events
  • 按照建议,我更新了函数中的代码。
猜你喜欢
  • 1970-01-01
  • 2018-12-16
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多