Я использую 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
}