【问题标题】:How can I return ordered data from Firebase database with Node.js using the firebase-admin module?如何使用 firebase-admin 模块从带有 Node.js 的 Firebase 数据库返回有序数据?
【发布时间】:2018-05-17 01:49:40
【问题描述】:

我正在尝试查询 Firebase 数据库以获取按时间戳排序的数据。

1:这可行,但返回的数据未按时间戳排序:

router.get('/articles', function(req, res, next) {
    admin.database().ref('articles').orderByChild('timestamp').once('value').then(function (snapshot) {
        let articles = snapshot.val();
        console.log(articles);
        res.render('articles', articles);
    });
});

2:这会返回我想要的按时间戳排序的数据(我可以在 console.log 中看到它),但我收到此错误:

// /node_modules/express/lib/response.js:1003
//   if (err) return req.next(err);
//                      ^
// TypeError: req.next is not a function

router.get('/articles', function(req, res, next) {
    admin.database().ref('articles').orderByChild('timestamp').on('child_added', function (snapshot) {
        let articles = snapshot.val();
        console.log(articles);
        res.render('articles', articles);
    });
});

我不明白我做错了什么。我看到两个 firebase 数据库调用是不同的,一个是 oncethen (所以它必须是一个承诺..?)另一个是 on(所以我想这只是一个正常的回调......)。

您知道这里为什么会发生吗?对不起,如果这很明显,但我有点初学者..

【问题讨论】:

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


    【解决方案1】:

    当您对 Firebase 数据库执行查询时,可能会有多个结果。所以快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果列表。

    因此,在您的第一个示例中,snapshot 包含以下内容:匹配节点的键、它们的值、它们之间的顺序。当您调用 snapshot.val() 时,此数据将转换为常规 JSON 对象,该对象没有空间容纳所有三条信息。此时订购信息被删除。

    解决方案是使用snapshot.forEach() 以正确的顺序循环匹配节点。

    admin.database().ref('articles').orderByChild('timestamp').once('value').then(function (snapshot) {
      var articles = [];
      snapshot.forEach(function(articleSnapshot)
        articles.push(snapshot.val());
      });
      console.log(articles);
      res.render('articles', articles);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-24
      • 1970-01-01
      • 2019-03-11
      • 1970-01-01
      • 2017-03-26
      • 1970-01-01
      • 2020-08-20
      • 2021-12-06
      相关资源
      最近更新 更多