我是firebase Environment的新手。我的firebase数据库如下
我有两个firebase表,名为customer和booking,我想用云功能进行连接操作。在预订表中,有一行名为 customerId ,对应于客户表的 uid 。我想在它们之间进行连接操作并显示连接表。任何帮助表示赞赏 我尝试了以下代码:
exports.join = functions.https.onRequest((request, response) => {
response.header('Content-Type', 'application/json');
response.header('Access-Control-Allow-Origin', '*');
response.header('Access-Control-Allow-Headers', 'Content-Type');
if (request.method === 'OPTIONS') {
response.status(204).send('');
}
var booking=admin.database().ref().child('booking');
var customer=admin.database().ref().child('booking');
booking.on('child_added',function(snap){
console.log(snap.val());
customer.child(snap.val().uid).once('value',user =>{
console.log(user.val());
response.status(200).json({ booking: snap.val(),customer: user.val() });
});
// response.status(200).json({ order: snap.val(),user: user.val() });
});
});
我修改了上面的代码。并按如下方式编写函数:
exports.join2 = functions.https.onRequest((req, res) => {
res.header('Content-Type', 'application/json');
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Content-Type');
//respond to CORS preflight requests
if (req.method === 'OPTIONS') {
res.status(204).send('');
}
var booking = admin.database().ref().child('booking');
var customer = admin.database().ref().child('customer');
customer.on('child_added', function (snap) {
var uid = snap.val().uid; // line 1 (results like 1,2,3,4,5,6)
console.log(uid);
booking.orderByChild('customerId').equalTo(uid).on('value', function (snapshot) {
// customer.orderByChild('uid').equalTo(userId).once('value', function(snapshot) {
console.log(uid + "-------------------------------------->");
console.log(snapshot.val());
res.status(200).json({ customer: snap.val(), booking: snapshot.val() });
});
});
});
在控制台中返回的数据很好但是当我以json对象的形式返回响应时,它只返回第一个客户的第一个对象及其预订详细信息,我无法返回所有客户数据与他们的预订。 任何建议。
答案 0 :(得分:2)
要使用您当前的数据结构通过UID加载客户,您需要执行以下操作:
var customers=admin.database().ref().child('customer');
customers.orderByChild('uid').equalTo(uid).once('value', function(snapshot) {
snapshot.forEach(function(customerSnapshot) {
console.log(customerSnapshot.key, customerSnapshot.val());
});
});
通过UID查询用户是一种反模式。最好将每个用户存储在JSON中的UID下:
customers
uid1: ...
uid2: ...
使用该结构,上述代码可以简化为:
var customers=admin.database().ref().child('customer');
customers.child(uid).once('value', function(snapshot) {
console.log(customerSnapshot.key, customerSnapshot.val());
});
这个代码不仅更简单,而且扩展性也更好,因为您不必为每个用户进行查询。
这只是您当前代码的众多问题之一。我建议您先阅读Firebase documentation for Web developers并取Firebase codelab for Web developer,而不是覆盖每个问题(并基本上将整个解决方案写入您的用例)。它们涵盖了许多基本的JavaScript,Web和Firebase交互。之后,在本地Node.js进程中使用Admin SDK,可以使用本地调试器进行调试。在那些之后,您将更好地为云函数编写代码。