Облачная функция Firebase; невозможно получить доступ к базе данных пожарного магазина - PullRequest
0 голосов
/ 04 июня 2019

У меня есть облачная функция firebase (запрос http), в которой я хочу обновить документ в своей базе данных firestore

const functions = require('firebase-functions')
const admin = require('firebase-admin');
admin.initializeApp();

exports.webhook = functions.https.onRequest(async (req, res) => {
const { id } = req.body


// Create payment
exports.webhook = functions.https.onRequest(async (req, res) => {
    const { id } = req.body

    // Create payment
    try {
      console.log(id)
      console.log('test before db call')

      admin.firestore().collection('payments').doc(id).update(
        {
            status: "paid"
        }
      ).then(() => {
          console.log('success')
      })

      console.log('test after db call')

      res.send('ok')
    } catch (e) {
      res.send('not ok')
    }
  })

Функция развертывается, console.log(id) корректна, но всякий раз, когда я звоню admin.firestore()он больше ничего не печатает.Комментируя эту часть, выдает «обещание решено». У меня сложилось впечатление, что я не могу получить доступ или использовать неправильный синтаксис для доступа к базе данных Firestore, но не могу понять, почему?

Печати журналов Firebase:

Выполнение функции началось

tr _........ (id)

тест перед вызовом дБ

Выполнение функции заняло 1103 мс, завершено скод статуса: 200

1 Ответ

2 голосов
/ 05 июня 2019

Вы не правильно используете обещание, возвращенное update(). Вам нужно подождать, пока это обещание не будет решено, прежде чем отправлять ответ. Прямо сейчас вы отправляете ответ, не дожидаясь завершения обновления базы данных, что означает, что облачные функции могут завершить всю асинхронную работу после его возврата. then не блокирует ваш код. Это просто позволяет добавить обратный вызов в асинхронную работу. Вы должны отправить ответ только после завершения:

  admin.firestore().collection('payments').doc(id).update(
    {
        status: "paid"
    }
  ).then(() => {
      console.log('success')
      res.send('ok')    // send response here
  })
...