javascript - 如何使用 firebase-admin 模块从带有 Node.js 的 Firebase 数据库返回有序数据?
问题描述
我正在尝试查询 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数据库调用是不同的,一个是一次然后(所以它必须是一个承诺......?)另一个是一个(所以我想这只是一个正常的回调......)。
你知道为什么会在这里发生吗?对不起,如果这很明显,但我有点初学者..
解决方案
当您对 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);
});
推荐阅读
- php - 将字符串转换为方括号分隔的数组
- math - 更改一个数字的符号以匹配另一个数字的符号
- laravel - 是否可以使用 API 令牌在 laravel 中进行用户模拟?
- android - Android Studio 设置活动 - 如果使用常规活动,它会影响我的应用程序的性能吗?
- laravel - Docker 卷覆盖 laravel 存储权限
- android - DJI SDK 中 Phantom 4 不支持三脚架模式
- docker - 重定向 Jenkins Pipeline Docker 插件的日志输出
- python - 从 URL 读取视频文件并使用 OpenCV 对其进行解析
- css - 交叉点观察者 API 和溢出隐藏
- vbscript - ASP Classic 中的 DateAdd 函数如何与“ww”周选项一起使用?