У меня есть отношения «один ко многим» между двумя объектами: курсами и файлами.Удаление загруженных файлов в Node.js с MongoDB
Итак, способ, которым я настроил свою базу данных, - использовать две отдельные коллекции: курсы и файлы.
У меня есть рабочая страница, которая позволяет пользователям загружать и добавлять файлы в курс. Кроме того, они могут удалять выбранные файлы на этой же странице.
Я беспокоюсь, когда удаляю выбранные файлы. После выбора файлов, которые необходимо удалить, и нажав кнопку отправки, я отправляю запрос DELETE, передающий список идентификаторов файлов. Ниже мой обработчик для удаления файлов:
var fs = require('fs');
var async = require('async'),
mongoose = require('mongoose');
var models = require('../models');
exports.deleteFiles = function (req, res) {
// loop through selected file-ids
async.eachSeries(req.body.files, function (id, done) {
// remove file from File collection
models.File.findByIdAndRemove(id, function (err, file) {
if (err) {
return done(err);
} else if (!file) {
return done();
}
// remove file reference from Course document
req.course.files.pull(mongoose.Types.ObjectId(id));
req.course.save(function (err) {
if (err) {
return done(err);
}
var path = __dirname + '/../public/upl/' + req.course.id + '/' + file.name;
// remove file from filesystem
fs.stat(path, function (err, stats) {
if (err && err.code === 'ENOENT') {
return done();
} else if (err) {
return done(err);
}
if (stats.isFile()) {
fs.unlink(path, done);
}
});
});
});
}, function (err) {
if (err) {
console.log(err);
req.flash('failure', 'Unable to delete files at this time.');
} else {
req.flash('success', 'The files have been deleted successfully.');
}
res.redirect('/admin/courses/' + req.course.id + '/files');
});
};
Это довольно грязное, как я должен сделать несколько шагов для каждого файл ID: удалить идентификатор из массива файла ХОДА, удалить файл из фактического сбора и удалить файл из файловой системы. Кроме того, у меня есть код обработки ошибок в начале каждого шага.
Можно ли улучшить это с помощью меньших шагов и/или улучшения обработки ошибок?
Мне это нравится. Это намного чище и удобочитаемо. И я никогда не знал, что вы можете назвать анонимные функции. – Mikey