Как контролировать вывод брошенных ошибок в функции firebase - PullRequest
0 голосов
/ 22 октября 2019

Я использую async / await в своих функциях firebase, которые при каждом вызове могут вызвать ошибку. Я не уверен, как правильно обрабатывать перехват каждой ошибки. Я хотел бы не заключать каждый вызов в попытку / отлов, так как объем используемого кода почти противоречит цели использования синтаксиса await.

Если я позволю моим awaits бросить, то firebase-функции будут ловить и регистрировать ихэто здорово. Однако я не хочу, чтобы эти ошибки распространялись обратно на клиент.

Как я могу перехватить все сгенерированные ошибки и контролировать возвращенный ответ?

1 Ответ

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

Задача . Гигантский try / catch:

module.exports = async (req, res) => {
  // Get the data from the request
  const input1 = req.body.input1
  const input2 = req.body.input2

  try {
    // First bit of await work
    const fileInfo = await db.getFileInfo(input2)

    // Do some non-await work
    const tempFilePath = generateUniqueTempFilePath(fileInfo)

    // More await work
    await storage.download(input1, tempFilePath)
    const checkinResult = await db.checkin(tempFilePath, data)

    const result = { checkinResult, fileInfo }
    res.json(result)
  } catch (err) {
    res.status(500).send(err.message)
  }
}

Одно из решений - обернуть все ваши ожидающие вызовы и связанную логику в отдельную функцию и попробовать / перехватить ее один раз в методе конечной точки.

Пример . Небольшой try / catch и отдельная функция:

const service = require('./serviceA')

module.exports = async (req, res) => {
  // Get the data from the request
  const input1 = req.body.input1
  const input2 = req.body.input2

  // Perform async code in a single call
  var result = undefined
  try {
    result = await service.perform(input1, input2)
  } catch (err) {
    res.status(500).send(err.message)
    return
  }
  res.json(result)
}

и

async function perform (input1, input2) {
  // First bit of await work (no try/catch!)
  const fileInfo = await db.getFileInfo(input2)

  // Do some non-await work
  const tempFilePath = generateUniqueTempFilePath(fileInfo)

  // More await work (but they should throw errors with suitable messages!)
  await storage.download(input1, tempFilePath)
  const checkinResult = await db.checkin(tempFilePath, data)

  return { checkinResult, fileInfo }
}

module.exports = { perform }
...