我正在尝试查询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数据库调用是不同的,一个是一次又一次(因此它必须是一个Promise ..?),另一个是on(所以我想它只是一个普通的回调...)。
您对这里为什么会发生有任何想法吗?抱歉,如果这很明显,但是我有点初学者。
最佳答案
当您对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);
});