2016-12-28 52 views
1

我想创建一个页面,从Firebase加载多个数据集,然后将它们传递到NodeJS呈现页面。我很感谢一些帮助,确保在forEach迭代之后发生这种情况;即,我不确定如何让Firebase for each迭代成为我承诺的一部分。等待Firebase数据加载之前呈现NodeJS页面forEach之前与Promise.all()

非常感谢!

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

看到我的答案 - 你可以从字面上刚刚从后台移到此代码前端,你是正在合并来自数据库的结果。 –

+0

这些'snapshot's数组,或者它是一个自定义(甚至是异步)'forEach'方法吗? – Bergi

+0

@Bergi,这是快照的内置Firebase forEach功能。 –

回答

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] }); 
    }); 
}); 

唯一的“问题”是结果会brands, stores, products由于你在Promsie.all

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 }) 
); 
+0

这是一个编码解决方案,但我认为这段代码不需要在API服务器上,只需将此代码移到前端即可! –

+0

这是对问题的“解决方案” - 答案的唯一真正部分是“控制台”。log'是不会显示任何有用的信息,而且尽管0 <==> 1换位,代码确实是正确的 - 不知道如何引进'火力点,queue'回答OP的问题,在所有 –

+0

非常感谢你的帮助和最后的简写,Jaromanda!我不相信我没有发现这个问题。 –

1

Firebase旨在成为无服务器架构。从长远来看,你不应该需要一个标准的RESTFul Node.js API服务器。你只需要Lambda工作人员。请参阅:https://github.com/firebase/firebase-queue

将工作放在队列中,工作人员将完成作业并更新Firebase。当Firebase更新时,它会向您的前端发送消息。它都是异步的,几乎适用于任何应用程序。

拥有API服务器也没有错,但实际上并不需要。除非你有一个很好的理由拥有我认为是一个Express API服务器,那么你可以抛弃它。

看起来你正在用这段代码做的所有事情都是从数据库获取值,你可以用前端而不是API服务器来完成,并将结果合并到前端,这样更好这样做。

从字面上看,只是把这里是在快速的代码,并将其移动到您的前端应用程序:)

+0

'从字面上看,只是把这里是在快速的代码,并将其移动到您的前端app',从字面上是不够的,还有很多事情需要做的比在问题移动代码到前端应用程序(而假设前端应用程序基于JavaScript是一种好的假设,它仍然是一个假设) –

+0

@JaromandaX我坚持我的意见/回答,如果您删除代码的快速路由线,你基本上可以解除代码,并把它放在前端。我是后端开发人员,但Firebase旨在成为一个非常客户端的架构。你直接回答了这个问题,但我想说一个更全面的观点。由于某种原因,Firebase被称为“无服务器”架构。想想那是什么意思。 –

+0

它只是看着'firebase-queue',好像很多设置都涉及到(我可能是错误的) - 我不是在争辩你的答案,我试图从中吸取教训:p –

相关问题