如何使用 firebase-admin 模块 return 使用 Node.js 从 Firebase 数据库订购数据?
How can I return ordered data from Firebase database with Node.js using the firebase-admin module?
我正在尝试查询 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:这个returns我按我想要的时间戳排序的数据(我可以在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 数据库调用是不同的,一个是 once 和 then (所以它一定是一个承诺..?)和另一个是 on(所以我想这只是一个正常的回调...)。
你知道为什么会这样吗?对不起,如果这很明显,但我有点初学者..
当您对 Firebase 数据库执行查询时,可能会有多个结果。所以快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果的列表。
因此,在您的第一个示例中,snapshot
包含以下内容:匹配节点的键、它们的值、和 它们之间的顺序。当您调用 snapshot.val()
时,此数据将转换为一个常规 JSON 对象,它没有 space 用于所有三个信息。此时订购信息被丢弃。
解决方案是使用 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 数据库以获取按时间戳排序的数据。
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:这个returns我按我想要的时间戳排序的数据(我可以在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 数据库调用是不同的,一个是 once 和 then (所以它一定是一个承诺..?)和另一个是 on(所以我想这只是一个正常的回调...)。
你知道为什么会这样吗?对不起,如果这很明显,但我有点初学者..
当您对 Firebase 数据库执行查询时,可能会有多个结果。所以快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果的列表。
因此,在您的第一个示例中,snapshot
包含以下内容:匹配节点的键、它们的值、和 它们之间的顺序。当您调用 snapshot.val()
时,此数据将转换为一个常规 JSON 对象,它没有 space 用于所有三个信息。此时订购信息被丢弃。
解决方案是使用 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);
});