Как обнаружить поток загрузки, неожиданно остановленный с busboy - PullRequest
0 голосов
/ 12 января 2020

У меня есть процесс загрузки файлов в mongodb, который работает нормально. Но у меня есть одна большая проблема. Если по какой-либо причине соединение потеряно (клиентский браузер закрыт, плохое соединение inte rnet, отключено питание и c.), У меня нет никаких указаний, и потоковая передача busboy / req не запускает никаких событий, которые приводят к ошибке обещания, не обработанной через некоторое время. Когда я тестирую его, немедленно загружаю и закрываю браузер. Я вижу, что несколько файлов были загружены на mongodb. Что-то вроде 10 из 100 файлов в пакете. У меня нет никаких указаний на то, был ли последний загружен полностью, и нет событий, чтобы ответить разрешением / отклонением. Код:

static upload (req) {
    return new Promise((resolve, reject) => {

        const docIds = [];
        const busboy = new Busboy({ headers: req.headers });

        const gridFSBucket = MongoDb.GridFSBucket({
            chunkSizeBytes: 64 * 1024,
            bucketName: 'bucketFiles',
            writeConcern: {w: 1}
        });

        busboy.on('file', function (fieldName, file, fileName, encoding, mimeType) {

            const bucketStream = gridFSBucket.openUploadStream(fileName, { metadata: { encoding,  mimeType} });

            file.on('error', function () {
                // Never hitting that
                reject(error);
            });
            file.pipe(bucketStream)
                .on('error', function (error) {
                    // Never hitting that
                    reject(error);
                })
                .on('finish', function (doc) {
                    docIds.push(doc._id);
                });
        });
        busboy.on('error', function (error) {
            // Never hitting that
            reject(error);
        });
        busboy.on('finish', function () {
            //Everything uploaded BUT
            //if connection lost never hitting that
            resolve(docIds);
        });

        req.on('error', function (error) {
            // Never hitting that
            reject(error);
        });
        req.pipe(busboy);
    });
}

1 Ответ

1 голос
/ 12 января 2020

Я просто узнаю это. Чтобы узнать, произошло ли неожиданное завершение потока / запроса, необходимо прослушать событие req.connection ('error' ...), например:

req.connection.on('error', function (error) {
    //do something like cancelling the mongodb session ...
    reject(error)
});
...