Javascript val()返回未定义的,但日志记录正确。Node.js firebase

Javascript val()返回未定义的,但日志记录正确。Node.js firebase,javascript,node.js,firebase,firebase-realtime-database,firebase-admin,Javascript,Node.js,Firebase,Firebase Realtime Database,Firebase Admin,我不知道为什么,但当我在snapshot.val()中返回对象时,它不会将任何内容返回到我的前端,但当我控制台.log()时,它会正确显示对象。我是这样退的: function Loggear({ email, password }) { db.ref("Usuarios") .orderByChild("email") .equalTo(email) .on("child_added", (snapshot

我不知道为什么,但当我在snapshot.val()中返回对象时,它不会将任何内容返回到我的前端,但当我控制台.log()时,它会正确显示对象。我是这样退的:

function Loggear({ email, password }) {
  db.ref("Usuarios")
    .orderByChild("email")
    .equalTo(email)
    .on("child_added", (snapshot) => {
      console.log(snapshot.val())
      return snapshot.val();
    });
}
如何在console.log()上显示我的对象:


我认为这是因为您没有从Loggear函数本身返回任何值。添加的on子级的值仅返回到Loggear的范围。您必须从函数本身返回它,即

function Loggear({ email, password }) {
  return db.ref("Usuarios")
    .orderByChild("email")
    .equalTo(email)
    .on("child_added", (snapshot) => {
      console.log(snapshot.val())
      return snapshot.val();
    });
}

如果只想一次性获取数据,请使用,而不是,如中所示
on()
在某个数据库位置设置一个持久侦听器,并在该位置发生更改时调用回调函数。那不是你想要的。相反,请使用
once()
,它返回通过数据快照解析的承诺:

function Loggear({ email, password }) {
  return db.ref("Usuarios")
    .orderByChild("email")
    .equalTo(email)
    .once("value", (snapshot) => {
      console.log(snapshot.val())
      return snapshot.val();
    });
}

这并没有令人遗憾地工作,因为某种原因返回了一个[函数]。无论如何谢谢你的帮助。是的,你是对的。正如Doug Stevenson所说,on函数将返回事件侦听器。这必须更改为.once()
function Loggear({ email, password }) {
  return db.ref("Usuarios")
    .orderByChild("email")
    .equalTo(email)
    .once("value", (snapshot) => {
      console.log(snapshot.val())
      return snapshot.val();
    });
}