【问题标题】:How to detect an upload stream stopped unexpectedly with busboy如何使用 busboy 检测上传流意外停止
【发布时间】:2020-04-29 03:14:38
【问题描述】:

我有一个将文件上传到 mongodb 的过程,它工作正常。但我有一个大问题。如果由于某种原因连接丢失(客户端浏览器关闭、互联网连接不良、电源关闭等),我没有任何迹象,并且 busboy/req 流式传输不会触发任何事件,导致一段时间后未处理的承诺错误。当我通过立即上传和关闭浏览器进行测试时。我看到很少有文件已上传到 mongodb。批处理中的 100 个文件中有 10 个。我不知道最后一个是否已完全上传,也没有任何事件可以通过解决/拒绝来响应。代码:

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);
    });
}

【问题讨论】:

    标签: javascript node.js file-upload stream busboy


    【解决方案1】:

    我只是发现它。要知道是否发生了意外的流/请求结束,您需要监听 req.connection('error' ...) 事件,例如:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-08
      • 1970-01-01
      • 1970-01-01
      • 2018-12-02
      • 2014-12-31
      • 2015-05-11
      • 2019-11-13
      相关资源
      最近更新 更多