数据库上的firebase Once('value')函数未响应

时间:2019-10-12 10:29:10

标签: node.js firebase firebase-realtime-database

很高兴为您提供帮助 我正在尝试在nodejs服务器上使用firebase。 初始配置后,我在用于从Firebase数据库中获取数据的节点服务器上建立了一个休息区

这是代码的第一个版本

  app.get('/api/users/:id', (req,res) =>{
      const usersRef = firebase.database().ref('users');
      usersRef.once('value')
      .then((snapshot) => {
        console.log(snapshot);
        res.status(200).send(snapshot.val())
      })
      .catch((error) => {
        console.log(error);
        res.status(404).send(error.message)
      })
    }))

我与邮递员检查了该路线,发现我没有收到该路线的任何回复 我已经用日志检查了路由是否收到了请求,并且发现必须创建对数据库的异步调用,因此,我创建了中间件 这是新版本的代码:

const asyncMiddleware = fn =>
  (req, res, next) => {
    Promise.resolve(fn(req, res, next))
      .catch(next);
};

app.get('/api/users/:id', asyncMiddleware(async (req,res,nex) =>{
  const usersRef = firebase.database().ref('users');
  await usersRef.once('value')
  .then((snapshot) => {
    console.log(snapshot);
    res.status(200).send(snapshot.val())
  })
  .catch((error) => {
    console.log(error);
    res.status(404).send(error.message)
  })
}))

但是即使更改后问题仍然存在。 因此,我发现问题的原因是因为当他尝试从firebase中获取数据而不返回任何响应时,“一次”函数堆栈。

我真的很想在这里为您提供帮助 谢谢

2 个答案:

答案 0 :(得分:0)

我想这与您处理异步请求的方式有关。尝试下面的代码,让我们看看能不能带来成功。

const fetchUsers = () => new Promise((resolve, reject) => {
  try{
    const usersRef = firebase.database().ref('users')
    usersRef.once('value', (snapShot) => {
      resolve(snapShot)
    })
  }catch(err){
    reject(err)
  }
})

 app.get('/api/users/:id', async (req,res) =>{
    const users = await fetchUsers()
    /** 
     * clean the users response
     * and respond with data
     */

    res
      .status(200)
      .json({
        data: users //cleaned
      })

}))

答案 1 :(得分:0)

因此,在调查之后,我找到了解决此问题的方法。 我已经通过使用Firebase的REST API在服务器发送请求上使用了axios

https://firebase.google.com/docs/reference/rest/database