Публикация ответа, который не может быть ответом, чтобы объяснить комментарий @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
задействован), то ваша проблема лежит в другом месте. В таком случае, пожалуйста, дайте больше информации о "иногда один поврежден": файл неполный? Это сервер показывает ошибку? Клиент получил ошибку? В последних случаях какая ошибка?