Загрузка файлов в NodeJs с экспресс-загрузкой файлов не работает должным образом - PullRequest
0 голосов
/ 25 января 2019

Я сделал REST API в NodeJs, чтобы загрузка файлов работала нормально, но есть проблема, если я загружаю более 2 изображений, только 2, 3 получают загрузки, а иногда 1 поврежден. Я думаю, что мой цикл работает слишком быстро для этого. удар мой код:

app.post('/img-upload', function(req, res) {
  if (!req.files)
    return res.status(400).send({"status":"false", "data":"Image Not Found"});

  // Use the mv() method to place the file somewhere on your server
    for(var key in req.files) {

        thisFile = req.files[key];
        let name = +new Date();
        thisFile.mv('./images/' + name++ +'.png', function(err) {
            if (err) {
                res.send(err);
            }   

        });

    }
        res.json({"status":"File uploaded!"});
});

используемый модуль: express-fileupload

1 Ответ

0 голосов
/ 25 января 2019

Публикация ответа, который не может быть ответом, чтобы объяснить комментарий @PatrickRoberts, у которого, кажется, есть точка.

thisFile.mv, очевидно, работает асинхронно, что означает, что function(err){...} может быть запущен после res.json(...) и следующее неявное return.

Хотя Node не должен уничтожать оставшиеся асинхронные процессы, вы все равно слишком рано сообщаете пользователю, что файлы были успешно загружены. (Вы можете отправить этот успех, , затем один из ваших обратных вызовов выдает ошибку ... но слишком поздно, вы не можете отправить эту ошибку клиенту.)

Два варианта, чтобы увидеть это до конца.

достойный вариант

Дождитесь завершения всех обратных вызовов, чтобы отправить успешный результат. Возможно что-то вроде:

let uploads = [];
for (let k in req.files) {
  req.files[k].mv('/my/path/to.png', function(err) {
    let promise = new Promise(function(resolve, reject) {
      if (err) {
        reject(err);
      } else {
        resolve();
      }
    });
    uploads.push(promise);

  })
} // end for loop
Promise.all(uploads).then(function() {
  res.json({"status":"File uploaded!"});
}).catch(function(err) {
  res.send(err);
});

медленный вариант, за который мне стыдно

Если это не помогло, и, если @PatrickRoberts обнаружил правильную проблему, вы можете попробовать сделать загрузку последовательно, например:

function processFile() {
  let file = req.files.shift()
  if (!file) return; // stop sequence condition
  file.mv('/my/path/to.png', function(err) {
    if (err) {
      res.send(err);
    } else {
      processFile();
    }
  })
}
processFile(); // start the recursive and sequential "loop"

Если ни один из этих способов не работает (второй, плохой вариант медленный, но является ясным доказательством того, что res.json / res.send задействован), то ваша проблема лежит в другом месте. В таком случае, пожалуйста, дайте больше информации о "иногда один поврежден": файл неполный? Это сервер показывает ошибку? Клиент получил ошибку? В последних случаях какая ошибка?

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