Дождитесь окончания цикла (JavaScript) - PullRequest
0 голосов
/ 12 октября 2018

Я использую HAPI v17 для создания RESTful API.Мне нужна следующая функция:

  • Загрузка нескольких файлов с POST-запросом (запрос вызывает асинхронную функцию создания)
  • Вычисление SHA-1 хеша для каждого содержимого файла
  • Изменитьимя файла: [sha-1 hash]. [расширение файла]

Проблема в том, что я получаю пустое возвращаемое значение из функции uploadFile.Как можно дождаться окончания итерации for перед возвратом массива?

Второй вопрос: можно ли вычислить хэш, не записав файл, а затем снова прочитав его с помощью createReadStream?Таким образом, я могу удалить временную загрузку файла.

Это текущий код:

const uuidv4 = require('uuid/v4')
const Fs = require('fs')
const crypto = require('crypto')

const create = async function (request, reply) {
  let files = uploadFile(request.payload['file'])
  console.log(files)

  let response = await models.document
    .bulkCreate(
      files
    )
  return response
}

function uploadFile (fileArr) {
  let files = []

  for (let i = 0; i < fileArr.length; i++) {
    console.log('file ' + i)
    let fileHash = uuidv4()
    let fileExt = path.extname(fileArr[i].hapi.filename)
    let file = fileArr[i]

    let ws = Fs.createWriteStream('uploads/tmp_' + fileHash + fileExt)
    file.pipe(ws)

    ws.on('finish', function () {
      Fs.createReadStream('uploads/tmp_' + fileHash + fileExt)
        .pipe(crypto.createHash('sha1').setEncoding('hex'))
        .on('finish', function () {
          let hash = this.read()

          Fs.rename('uploads/tmp_' + fileHash + fileExt, 'uploads/' + hash + fileExt, function (err) {
            if (err) throw err
            files.push({ hash: hash, path: hash + fileExt })
          })

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