如何使用id加入firebase中的两个单独的表(不是子表)?

时间:2018-04-20 11:22:59

标签: node.js firebase firebase-realtime-database

我是firebase Environment的新手。我的firebase数据库如下

image of two firebase table

我有两个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对象的形式返回响应时,它只返回第一个客户的第一个对象及其预订详细信息,我无法返回所有客户数据与他们的预订。 任何建议。

1 个答案:

答案 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,可以使用本地调试器进行调试。在那些之后,您将更好地为云函数编写代码。