我已经实现了通过XMLHttpRequest将文件从React前端发送到nodeJS(koa v1)后端,以获得跟踪文件上传进度的能力。作为补充,我决定通过标准xhr.abort()
功能添加上传取消。没关系,在客户端运行得非常好,但每次我都被后端抛出Parse Error
:
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;
};
正如您所看到的,我使用了来自文件和可写流的可读流来保存它,这是一个问题,因为我无法在此处理Parse Error
,我试图使用{这两个流上的{1}}和error
事件,但它们只是没有发出,与end
包裹的情况相同。捕获此错误的唯一方法是顶级try catch
中间件,但它远离我的控制器。
那么有没有办法在我的控制器中捕获错误并向客户端发送正确的响应?