在Node.js后端通过xmlhttprequest处理文件上传中止

问题描述 投票:1回答:0

我已经实现了通过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)

下面是处理文件流并将其保存到本地计算机的控制器代码。 在formDataco-busboy formData解析之前

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 ,我试图在这两个流上使用errorend事件,但是它们只是没有发出,用try catch包裹的情况相同。 捕获此错误的唯一方法是顶层app.on('error', cb)中间件,但它离我的控制器很远。

那么,有什么方法可以捕获控制器内部的错误并向客户端发送正确的响应?

javascript node.js ajax xmlhttprequest koa
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.