2

「multiparty」パーサーを使用して、アプリケーションで multipart-form-data を読み取って処理しています。私のアプリのミドルウェアは、アップロードされたファイルの内容を読み取り、オンザフライで解析し、成功した場合は次のミドルウェアに送信します。そうでない場合は、リクエストを中止してエラーを返す必要があります。

/**
 * Middleware to read n parse uploaded multi-part form data 
 * for campaign creation.
 * After successful parse, sends to next layer.
 *
 **/

var mp = require('multiparty');

module.exports = function(req, res, next) {
  console.log("File processor at work...");
  var form = new mp.Form();

  form.on('part', function(part) {
    if (!part.filename) { part.resume();}
    else { 
      part.setEncoding('utf8');
      part.on('readable', function() {
        readFile(req, res,  part); 
      });

      part.on('error', function (e) {
        console.log("Am i reached??");
        //return res.status(400).json(e);
        form.emit('error', e);
      })

    }
  });

  form.on('error', function(err) {
    console.log("Error while processing upload.", 3);
    res.status(400).json(err);
  });

  form.on('close', function() {
    console.log("Reading finished. Forwarding to next layer...");
    return next();
  });

  form.parse(req);
}

解析中 (つまり readFile()) にエラーが発生した場合、残りのパーツ バッファーを消費せずに HTTP エラーを返したいと考えています。これを行うための適切な方法があると確信していますが、正しくありません。

readFile() 内から例外をスローして、form.on('part', ...) でキャッチしようとしました。例外をキャッチできたにもかかわらず、フローを中止しませんでした。form.on(part,..) からの return() は、この evt ハンドラ関数から返されますが、外側の関数からは返されません。

nodejsストリームのドキュメントに従って、readFile()内からエラーイベントを発行して、part.on('error', ...)でエラーを処理しようとしました。これも同じ動作になり、処理は終了しません。

ここで何が欠けていますか?これ以上処理したくないことをストリームに伝える適切な方法はありますか..?

4

0 に答える 0