在使用Promise.all()forEach呈现NodeJS页面之前,先加载Firebase数据,

我试图创build一个从Firebase加载多个数据集的页面,然后将它们传递给NodeJS呈现的页面。 我会感谢一些帮助,确保在forEach迭代之后发生这种情况; 即,我不确定如何让Firebase for each迭代成为我的承诺的一部分。

非常感谢!

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

您的代码看起来99%确定

 router.get('/', function(req, res, next) { var getBrands = ...; var getStores = ...; var getProducts = ...; 

到目前为止这么好(甚至没有复制代码,因为这是正确的

  console.log(brands, stores, products); 

品牌,商店和产品是在.thencallback中声明的,所以无论如何,在这一点上它们总是不确定的

  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由于您的订单getBrands, getStores, getProducts在Promsie.all

然而,你似乎认为(根据指数),结果将是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 }) ); 

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

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

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

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

从字面上看,只需把这里的Express代码移到你的前端应用:)