Firebase HTTP 云函数错误“无法获取 /”

1 node.js express firebase google-cloud-functions

我正在尝试从 firebase 获取用户数据,但我一直收到“无法获取/”错误。

//firebase init
const functions = require('firebase-functions');
const admin = require("firebase-admin");
admin.initializeApp();

//express and cors init
const express = require('express');
const cors = require('cors');

//middleware init
const app = express();
app.use(cors());

const database = admin.database();

app.get("/users", function (request, response) {
    return database.ref('/users').on("value", snapshot => {
        return response.status(200).send(snapshot.val());
    }, error => { 
        console.error(database);
        return response.status(500).send(err);
    })
});

exports.users = functions.https.onRequest(app);
Run Code Online (Sandbox Code Playgroud)

我还尝试使用另一个网站的另一个功能,我指的是至少获取用户名,但它返回错误。

exports.users = functions.https.onRequest((req, res) => {
     database().ref('/merchants').once('value').then(function(snapshot) {
       var username = snapshot.val().username;
       res.status(200).send(username);
     });
});
Run Code Online (Sandbox Code Playgroud)

sam*_*man 5

问题一:导出快递申请

当您express通过 Cloud Functions导出应用程序时,路径将相对于导出的函数名称。您将您的应用程序导出为exports.users将您的函数的根路径设置为/users并调用它,您将访问https://us-central1-<project-id>.cloudfunctions.net/users.

但是,因为您还为/users(using app.get("/users", ...))定义了一个路由处理程序,所以您添加了一个 for 处理程序https://us-central1-<project-id>.cloudfunctions.net/users/users

Cannot GET /抛出错误是因为当您在 处调用函数时https://us-central1-<project-id>.cloudfunctions.net/users,相对 URL 设置为"/",您尚未为其配置处理程序(使用app.get("/", ...))。

因此,要修复上面的代码,请更改

app.get("/users", function (request, response) {
Run Code Online (Sandbox Code Playgroud)

app.get("/", function (request, response) {
Run Code Online (Sandbox Code Playgroud)

问题 2:用户名查询

问题可能就像您调用database()而不是调用一样简单admin.database()

但是,此查询的目的尚不清楚,因此我假设您有一个商家的 ID,并且您正在尝试获取该特定商家的所有者的用户名。

这意味着数据结构类似于:

{
  "users": {
    "somePerson": { ... },
    "otherPerson: { ... }
  },
  "merchants": {
    "reallyGreatGuyInc": {
      "username": "somePerson",
      ...
    },
    "realShadyPeopleInc": {
      "username": "otherPerson",
      ...
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如果您导出了一个函数getMerchantUsername,在您通过 GET 参数传入商户 ID 并在 URL 处调用它https://us-central1-<project-id>.cloudfunctions.net/getMerchantUsername?id=reallyGreatGuyInc,您将使用以下代码定义它:

{
  "users": {
    "somePerson": { ... },
    "otherPerson: { ... }
  },
  "merchants": {
    "reallyGreatGuyInc": {
      "username": "somePerson",
      ...
    },
    "realShadyPeopleInc": {
      "username": "otherPerson",
      ...
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 无效字符的测试基于RTDB:结构数据文档中的列表。这在某种程度上阻止了查看其他数据库值。
  • 如果你只需要 username 的值,而不是请求整个商家对象并解析它,那么只请求用户名,就像上面我使用的例子一样`/merchants/${req.query.id}/username`