snapshot.val() returns 未定义,但记录正确。 Node.js 火力基地

snapshot.val() returns undefined, but it logs correctly. Node.js firebase

我不知道为什么,但是当我 return snapshot.val() 中的对象时,它不会 return 我前面的任何东西,但是当我 console.log () 它,它正确地显示了对象。我是这样 return 的:

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

它如何在 console.log() 上显示我的对象:

{
  ciudad: 'Buenos Aires',
  codigoPostal: '1000',
  direccionCalle: 'la casa de tomas',
  direccionNumero: '1',
  documento: '1',
  email: 'firebase@pruebita.com',
  fechaNacimiento: '1111-01-01',
  nombreCompleto: 'firebase',
  password: 'contraseña',
  telefonoCelular: '1233'
}

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

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

如果您只想获取一次数据,请使用once() instead of on(), as shown in the documentationon() 在某个数据库位置设置一个持久监听器,每当该位置发生变化时都会调用您的回调函数。那不是你想要的。而是使用 once(),其中 returns 承诺通过数据快照解决:

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