我尝试创建一个从Firebase加载多个数据集的页面,然后将它们传递给NodeJS呈现的页面。我非常感谢帮助确保在forEach迭代之后发生这种情况;也就是说,我不确定如何让Firebase forEach迭代成为我承诺的一部分。
非常感谢你!
router.get('/', function(req, res, next) {
var getBrands = brandRef.once('value').then(function(snapshot){
var brands = [];
snapshot.forEach(function(childSnapshot){
console.log(childSnapshot.val()['name']);
brands.push({'name' : childSnapshot.val()['name'] });
});
return brands;
});
var getStores = storeRef.once('value').then(function(snapshot){
var stores = [];
snapshot.forEach(function(childSnapshot){
stores.push({'name' : childSnapshot.val()['name'] });
});
return stores;
});
var getProducts = productRef.once('value').then(function(snapshot){
var products = [];
snapshot.forEach(function(childSnapshot){
products.push({'name' : childSnapshot.val()['name'] });
});
return products;
});
console.log(brands, stores, products);
Promise.all([getBrands, getStores, getProducts]).then(function(results){
res.render('index', { title: 'MStore Demo Portal', stores: results[0], brands: results[1], products: results[2] });
});
});
答案 0 :(得分:2)
您的代码看起来很好99%
router.get('/', function(req, res, next) {
var getBrands = ...;
var getStores = ...;
var getProducts = ...;
到目前为止一直很好(甚至没有打扰复制代码,因为它是正确的
console.log(brands, stores, products);
品牌,商店和产品在.then
回调中声明,因此无论如何,此时它们始终未定义
Promise.all([getBrands, getStores, getProducts]).then(function(results){
res.render('index', { title: 'MStore Demo Portal', stores: results[0], brands: results[1], products: results[2] });
});
});
上面唯一的“问题”是,由于您在Promsie.all中的brands, stores, products
订单,结果将为getBrands, getStores, getProducts
但是,您似乎(根据索引)认为结果将是stores, brands, products
- 在代码中交换索引0和1,或者调用
Promise.all([getStores, getBrands, getProducts]).then
小费,如果您使用的是最近的node.js,则可以执行以下操作
Promise.all([getStores, getBrands, getProducts]).then(([stores, brands, products]) =>
res.render('index', { title: 'MStore Demo Portal', stores, brands, products })
);
答案 1 :(得分:1)
Firebase旨在成为无服务器架构。从长远来看,您不需要标准的RESTFul Node.js API服务器。你只需要Lambda工作人员。请参阅:https://github.com/firebase/firebase-queue
将工作放在队列中,工作人员将接收作业并更新Firebase。当Firebase更新时,它会向您的前端发送消息。它都是异步的,几乎适用于任何应用程序。
拥有API服务器也没有错,但实际上并不需要它。除非你有充分的理由让我认为它是一个Express API服务器,否则你可以抛弃它。
看起来您正在使用此代码执行的操作是从数据库获取值,您可以使用前端而不是API服务器执行此操作,并将结果合并到前端,这样做要好得多这样的事情。
从字面上看,只需使用Express中的代码,然后将其移至您的前端应用程序:)