Как вернуть упорядоченные данные из базы данных Firebase с помощью Node.js с помощью модуля firebase-admin? - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь запросить базу данных 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 разные, один один раз и затем (так что это должно быть обещание ..?), А другой - на (так что я полагаю, что это просто обычный обратный вызов ...).

У вас есть идеи, почему здесь происходит? Извините, если это очевидно, но я начинающий ..

1 Ответ

0 голосов
/ 17 мая 2018

Когда вы выполняете запрос к базе данных 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);
});
...