NodeJS - Если перемещение нескольких файлов не удалось, удаление тех, которые не удалось - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь загрузить несколько файлов с помощью HTTP-сообщения, а затем NodeJS обрабатывает:

  1. сохраняет информацию о файлах в базе данных
  2. перемещает файлы из папки tmp в постоянная папка
  3. в случае сбоя при перемещении любого файла удалите файл из папки tmp

Мои две проблемы описаны в комментариях в фрагменте кода ниже:

  1. path.resolve не работает
  2. итератор не работает в fs.rename
for (i = 0; i < req.files.length; i++) {
    
    const file = new fileSchema({
        _userId: req.body._userId,
        _companyId: req.body._companyId,
        _meetingId: response._id,
        originalFilename: req.files[i].originalname,
        savedFilename: req.files[i].filename,
    });

    file.save().then((response) => { }).catch(error => { console.log(error) });

    const currentPath = path.resolve(temp_folder, req.files[i].filename);
    const newPath = upload_folder +"/"+ req.body._userId +"/"+ req.body._companyId +"/"+ response._id +"/"+ req.files[i].filename;
    // 1. why doesn't path.resolve work with the inputs on the line above? I have to concat a string as in line above?
    
    fs.rename(currentPath, newPath, function(err) {
        if (err) {
            console.log("Error moving files");

            try { removeTempFiles(temp_folder, req.files[i]); } // helper function which works written elsewhere
            // 2. req.files[i] is undefined (even though req.files works) so the line above fails - i.e. the iterator isn't captured within rename?
            catch(err) { console.log(err); }

        } else {
            console.log("Successfully moved the file!");
        }
    });
}

Любая помощь приветствуется, спасибо.

1 Ответ

1 голос
/ 09 июля 2020

Измените это

for (i = 0; i < req.files.length; i++) {

на это:

for (let i = 0; i < req.files.length; i++) {

Добавление let создаст отдельный i для каждой итерации for l oop поэтому он останется действительным в вашем fs.rename() обратном вызове.

И, path.join(), вероятно, лучший выбор, чем path.resolve() для объединения сегментов пути.

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