Javascript 如何使用Firebase管理模块通过Node.js从Firebase数据库返回已排序的数据?

Javascript 如何使用Firebase管理模块通过Node.js从Firebase数据库返回已排序的数据?,javascript,node.js,firebase,firebase-realtime-database,firebase-admin,Javascript,Node.js,Firebase,Firebase Realtime Database,Firebase Admin,我正在尝试查询Firebase数据库,以获取按时间戳排序的数据 1:这可以工作,但返回的数据不是按时间戳排序的: router.get('/articles', function(req, res, next) { admin.database().ref('articles').orderByChild('timestamp').once('value').then(function (snapshot) { let articles = snapshot.val();

我正在尝试查询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);
    });
});
// /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);
    });
});
2:这会返回我想要的按时间戳排序的数据(我可以在console.log中看到),但我得到以下错误:

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);
    });
});
// /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数据库调用是不同的,一个是一次然后(所以这一定是一个承诺?),另一个是上的(所以我想这只是一个普通回调…)


你知道为什么会发生在这里吗?很抱歉,如果这是显而易见的,但我是个初学者。

当您对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);
});

对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);
});