Javascript 在nodejs后端处理xmlhttprequest中止文件上载
我已经实现了通过XMLHttpRequest将文件从React前端发送到nodeJS(KoaV1)后端,特别是为了能够跟踪文件上传进度。作为补充,我决定通过标准的Javascript 在nodejs后端处理xmlhttprequest中止文件上载,javascript,node.js,ajax,xmlhttprequest,koa,Javascript,Node.js,Ajax,Xmlhttprequest,Koa,我已经实现了通过XMLHttpRequest将文件从React前端发送到nodeJS(KoaV1)后端,特别是为了能够跟踪文件上传进度。作为补充,我决定通过标准的xhr.abort()函数添加upload cancel。没关系,在客户端工作得很好,但每次我收到后端抛出的解析错误时: Error: Parse Error at Error (native) at Socket.socketOnEnd (_http_server.js:422:22) at emitNone (events.j
xhr.abort()
函数添加upload cancel。没关系,在客户端工作得很好,但每次我收到后端抛出的解析错误时:
Error: Parse Error
at Error (native)
at Socket.socketOnEnd (_http_server.js:422:22)
at emitNone (events.js:91:20)
at Socket.emit (events.js:185:7)
at endReadableNT (_stream_readable.js:973:12)
at _combinedTickCallback (internal/process/next_tick.js:74:11)
at process._tickDomainCallback (internal/process/next_tick.js:122:9)
下面是处理文件流并将其保存到本地计算机的控制器代码。在它之前,formData
由co-busboy
module.exports.saveFiles = function* (files) {
const savedFiles = [];
let file = yield files;
while (file) {
const fileName = file.filename;
const fileExt = path.extname(fileName);
const newFileName = `${generator.generate()}${fileExt}`;
const filePath = path.join(config.uploadFolder, newFileName);
const stream = fs.createWriteStream(filePath);
file.pipe(stream);
savedFiles.push({
fileId: newFileName,
fileName,
mimeType: file.mimeType,
});
file = yield files;
}
return savedFiles;
};
正如您所看到的,我使用了来自文件的可读流和可写流来保存它,这是一个问题,因为我无法在这里处理解析错误
,我尝试在这两个流上使用错误
和结束
事件,但它们只是没有发出,与通过尝试捕获
包装的情况相同。捕获此错误的唯一方法是顶级app.on('error',cb)
中间件,但它离我的控制器很远
那个么,有并没有办法捕获控制器内部的错误并向客户端发送正确的响应呢