gpt4 book ai didi

javascript - 函数中的 Firebase 查询未按预期返回

转载 作者:行者123 更新时间:2023-12-03 02:38:08 24 4
gpt4 key购买 nike

我正在尝试做一些相当简单的事情,但在获得预期的行为方面遇到了很多困难。在由外部 HTTP 调用触发的 Firebase 函数中,我尝试根据在 HTTP 调用中获取的值从 Firebase 数据库中提取对象。

奇怪的是,本质上相同的代码可以在我的网络应用程序中工作(使用 Angular ),但它不能在函数中工作(基于 Node)。

这是数据库结构:

ROOT
/users
/-L1toTQ_nLwyy2jhuz1h
/athlete
/name
/id
/country
/-L1twwvmpAvBI80uHpFc
/athlete
/name
/id
/country

在我用 Javascript(Angular)构建的网络应用程序上,以下函数按我的预期返回快照。我正在每个用户中搜索(不知道唯一 ID (-L1toTQ_nLwyy2jhuz1h)。相反,我正在搜索嵌套在 users/{unique}/athlete/... 下的 id,这符合我的预期。

这有效

var fire = firebase.database();
var externalID = 12345;
var users = fire.ref('users');
var query = users.orderByChild('athlete/id').equalTo(externalID);

query.once('value', function(snap){
var k = Object.keys(snap.val())[0]; //gets the key of the first result
var user = snap.val(); // sets user = full returned object from firebase
console.log(user[k]); // logs below
});

正如预期的那样,这是用户[k] 记录到控制台的内容:

{
"athlete": {
"country": "United States",
"name": "Jack",
"id": 12345,
}
}

我使用该代码作为编写云函数的基础,但我无法得到类似的结果。相反,snap.val() = nullsnap.key = 'users'。这意味着当我尝试运行 var k = Object.keys(snap.val())[0]

时出现错误

这不起作用

var admin = require("firebase-admin");
admin.initializeApp(functions.config().firebase);
var db = admin.database();

exports.incomingTest = functions.https.onRequest((request, response) => {

const externalId = 12345;

const users = db.ref('users');
const query = users.orderByChild('athlete/id').equalTo(externalId);

query.once('value').then(snap => {
console.log(snap.val()); // logs null
console.log(snap.key); // logs 'users'


}).catch(reason =>{
console.log(reason);
});
response.send(200)
});

我已经尽我所能地环顾四周,有些地方说你不能深入查询多个级别,但从网络应用程序中可以清楚地看出我可以......所以我不明白为什么它不能'无需通过云功能进行工作。另外,我发现一篇文章说 Firebase 添加了深度查询多个级别的功能。

之前我还收到一个错误,说我正在搜索非索引变量,因此我将其添加到我的规则中,并且不再收到该错误。

{
"rules": {
".read": "auth != null",
".write": "auth != null",
"users": {
".indexOn": "athlete/id"
}
}
}

最后,我没有从 query.once() 函数收到错误响应(请注意 .catch())。但我实际上成功返回了 snap,但它是 null。

最佳答案

我不完全确定这会解决您的特定问题,但我可以告诉您您没有正确编写 HTTPS 类型函数。 HTTPS 函数在发送响应后终止。在您的情况下,您在数据库查询完成之前技术上发送响应(因为on()是异步的,它会立即返回)。

尝试这样编写,以确保数据库查询在发送响应之前完成:

query.once('value').then(snap => {
console.log(snap.val()); // logs null
console.log(snap.key); // logs 'users'
response.send('ok') // note: send does not take a status code
}).catch(reason =>{
console.log(reason);
response.status(500).send('not ok')
});

另请注意,我已经更正了您对响应的使用。

关于javascript - 函数中的 Firebase 查询未按预期返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48453095/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com