gpt4 book ai didi

javascript - 如何使用 Busboy 检测上传流意外停止

转载 作者:行者123 更新时间:2023-12-02 22:06:29 25 4
gpt4 key购买 nike

我有一个将文件上传到 mongodb 的过程,该过程运行良好。但我有一个大问题。如果由于某种原因连接丢失(客户端浏览器关闭、互联网连接不良、断电等),我没有任何指示,并且 Busboy/req 流不会触发任何事件,从而导致在一段时间后出现 promise 未处理错误。当我通过立即上传并关闭浏览器来测试它时。我看到很少有文件被上传到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);
});
}

最佳答案

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

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

关于javascript - 如何使用 Busboy 检测上传流意外停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59699151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com