无法使用AdminSDK从功能读取Firebase

时间:2018-07-09 17:16:06

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

正如我在项目中使用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
}

基本url有效并返回“ Firebase Express上的Hello消息!”,但是连接到Firebase的URL却没有。它返回以下错误。

{"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. 我正在本地主机firebase serve --only functions中使用以下命令运行firebase函数。这会是个问题吗?

1 个答案:

答案 0 :(得分:0)

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