Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 从firebase检索并在ejs中渲染_Node.js_Firebase Realtime Database_Ejs - Fatal编程技术网

Node.js 从firebase检索并在ejs中渲染

Node.js 从firebase检索并在ejs中渲染,node.js,firebase-realtime-database,ejs,Node.js,Firebase Realtime Database,Ejs,所以我基本上是在尝试为我的ejs前端做一个“foreach”循环,但我似乎无法在server.js中重新渲染快照。我似乎无法将变量放入res.render()中。从firebase检索数据供参考没有问题 我已经尝试过各种方法,比如在参考中移动它等等 app.get('/',函数(req,res){ var ref=database.ref(“课程”); //var ref=firebase.database().ref(“用户”); 参考“值”,功能(快照){ snapshot.forEach(

所以我基本上是在尝试为我的ejs前端做一个“foreach”循环,但我似乎无法在server.js中重新渲染快照。我似乎无法将变量放入res.render()中。从firebase检索数据供参考没有问题

我已经尝试过各种方法,比如在参考中移动它等等

app.get('/',函数(req,res){
var ref=database.ref(“课程”);
//var ref=firebase.database().ref(“用户”);
参考“值”,功能(快照){
snapshot.forEach(函数(childSnapshot){
var childData=childSnapshot.val();
});
});
res.render('页面/索引'{
ChildData:ChildData
});
});
使用此

app.get('/', function(req, res) {
   var ref = database.ref('Courses');
// var ref = firebase.database().ref("users");

   ref.on("value", function (snapshot) {
     snapshot.map(function (childSnapshot) {
        var childData = childSnapshot.val();
     });
     res.render('pages/index', {
        ChildData:childData
     });

   });

});

将response send方法移动到
ref.on
的回调中,并将
forEach
更改为
map
,因为map是同步的,所以它将首先完成迭代,并在响应中发送数据

数据是从Firebase异步加载的,因为这可能需要一些时间。应用程序的主代码不会等待数据从服务器返回,而是直接继续。然后,当数据可用时,将使用该数据调用回调

这意味着任何需要来自数据库的数据的代码都需要在该回调中

app.get('/', function(req, res) {
    var ref = database.ref('Courses');

    ref.once("value", function (snapshot) {
        var childData;
        snapshot.forEach(function (childSnapshot) {    
            childData = childSnapshot.val();
        });
        res.render('pages/index', {
            ChildData:childData
        });    
    });
});
主要变化:

  • 我将
    res.render
    移动到回调中,以便它在数据可用后运行
  • 我在循环之前声明
    var childData
    ,这样循环之外的代码也可以使用它
  • 我使用
    一次
    而不是上的
    ,因此数据只加载一次

它返回的snapshot.map不是函数,并且不会从ref.onSend snapshot中读取子数据作为响应,而不是childData@mzparacha
snapshot
是一个对象,它没有
map
方法。不过,它确实有一个
forEach
方法,所以这就是通常用来循环它的方法。谢谢,它可以工作!但我用另一个变量数组替换了var childdata。并在childData快照下方添加了array.push