Функция однократной передачи ('значение') в базе данных не отвечает - PullRequest
0 голосов
/ 12 октября 2019

Я был бы рад вашей помощи. Я пытаюсь использовать firebase на сервере nodejs. после первоначальных настроек я строю отдых на сервере узлов, который использовал для извлечения данных из базы данных 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 голосов
/ 17 октября 2019

Итак, после расследования я нашел решение этой проблемы. Я использовал axios при отправке запроса с сервера, используя REST API firebase

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

0 голосов
/ 12 октября 2019

Я думаю, это связано с тем, как вы обрабатываете асинхронные запросы. Попробуйте приведенный ниже код, и посмотрим, удастся ли нам.

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

}))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...