Нет необходимости сохранять ваш файл на диск, вы можете транслировать его напрямую с busboy
на mongo с помощью своего рода потокового интерфейса - я не уверен, как вы хотите сохранить файл, но если это простоПростая структура файла. Я думаю, вам следует использовать GridFS Монго .
Я предполагаю, что вы получили соединение и клиента откуда-то, поэтому мы просто будем их использовать.Нам нужно ведро GridFS из клиентской базы:
const db = client.db(dbName);
const bucket = new mongodb.GridFSBucket(db);
Мы будем использовать его, когда мы хотим сохранить файл:
// A file was recieved
busboy.on('file', function (fieldname, file, filename, encoding, mimetype) {
const saveTo = path.join('.', filename);
// here we PIPE the file to DB.
file.pipe(bucket.openUploadStream(saveTo));
});
Теперь есть также вопрос ответа, когда файлына самом деле сохраняются - так как это делается асинхронно.Поэтому нам нужно вести подсчет запущенных операций следующим образом:
// place this in the request callback.
// here's our counter - we'll increment it for each operation started.
let ops = 0;
const dec = () => --ops || res.end("That's all folks!");
Теперь мы немного изменим приведенный выше код, чтобы не отвечать, пока файлы не сохранены в Mongo:
// A file was recieved
busboy.on('file', function (fieldname, file, filename, encoding, mimetype) {
ops++; // we increment ops for each file saved
const saveTo = path.join('.', filename);
// here we PIPE the file to DB (pass the db and collection here).
file.pipe(bucket.openUploadStream(saveTo))
.on('finish', dec);
});
ops++; // we're waiting for finish of the request also so another increment
busboy.on('finish', dec);
Как вы видите каждый раз, когда начинается загрузка файла, мы увеличиваем число операций, а когда оно заканчивается, мы уменьшаем его.Оператор ||
выполнит метод res.end
, когда ops
достигнет 0
.