Как потоковый файл в пост / поставить запрос с обработкой ошибок? - PullRequest
0 голосов
/ 02 февраля 2020

Это не вопрос "каков наилучший способ рефакторинга следующего кода". речь идет о том, «как я могу реорганизовать следующий код, чтобы иметь какой-либо контроль над обоими исключениями».


У меня есть следующий код, который передает файл в запрос PUT.

import fs from 'fs'
import got from 'got' // it doesn't really matters if it's `axious` or `got`

async function sendFile(addressToSend: string, filePath: string) {
      const body = fs.createReadStream(filePath)
      body.on('error', () => {
        console.log('we cached the error in block-1')
      })
      try {
        const result = await client.put(addressToSend, {
          body,
        })
      } catch (e) {
        console.log('we cached the error in block-2')
      }
}

Я пытаюсь реорганизовать этот код таким образом, чтобы дать мне возможность отлавливать все ошибки в одном месте.

Приведенное выше решение не дает мне способа проверить сбой stream. например, если я передам файл, который не существует, функция напечатает и we cached the error in block-1, и we cached the error in block-2, но у меня нет способа повторно выдать эту первую ошибку или использовать ее в тестах в любом случае.


Примечание:

Я не уверен, что лучший способ решить это сделать это:

Потому что, когда я передаю filePath, который не существует, rej функция будет вызываться дважды, что является очень плохой практикой.

function sendFile(addressToSend: string, filePath: string) {
  return new Promise(async (res, rej) => {
    const body = fs.createReadStream(filePath)
    body.on('error', () => {
      console.log('we cached the error in block-1')
      rej('1')
    })
    try {
      const result = await client.put(addressToSend, {
        body,
      })
      res()
    } catch (e) {
      console.log('we cached the error in block-2')
      rej('2')
    }
  })
}

1 Ответ

0 голосов
/ 02 февраля 2020

Мне это не очень нравится, но это лучшее, что я могу придумать:

function streamFilePut(client: Got, url: string, filePath: string) {
  const body = fs.createReadStream(filePath)
  const streamErrorPromise = new Promise((_, rej) => body.on('error', rej))

  const resultPromise = new Promise((res, rej) => {
    return client
      .put(url, {
        body,
      })
      .then(res, rej)
  })

  return Promise.race([streamErrorPromise, resultPromise])
}
...