2016-07-16 9 views
0

私は、ファイルアップロードをチャンクで処理するexpressJS Webアプリケーションを作成しています。受信可能なファイルには、処理してオンザフライで検証する必要があるデータが含まれています。ストリーミングと非同期の検証を伴うNodeJS処理ファイルのアップロード

私は以下のようにそれを処理しています:processLine()関数で

module.exports = function(req, res, next) { 
    logger.info("file converter executing..."); 

    req.on('data',function(chunk){ 

    // Read a line from the chunk 
    var line = readALine(req, chunk); 
    while ((line = readALine(req, chunk)) !== null) { 

     // ignore comment lines and blank lines... 
     if (line.indexOf("#") === 0 || line.length === 0) continue; 

     result = processLine(req, line); 
    } 
    }); 

    /** EOF: request stream -- move processing to next layer. **/ 
    req.on('end', function() { 
    console.log("handing control to next middle ware..."); 
    return next(); 
    }); 

}; 

を、私は、入力データの各ラインを検証する必要があります。しかし、問題は検証が非同期であることです。なぜなら、もともとはDBにある値をチェックしようとしていますが、Redis Cacheやプログラムの内部キャッシュに遅延ロードされているからです。したがって、検証は非同期です。

私は現在のチャンクの検証を終了するまで、データのチャンクを処理していますが、ストリームからそれ以上のイベントは受信したくありません。

私の質問:

  1. アムI右の一時停止()、履歴書()APIがここに収まると仮定では?だから、非同期検証の約束が終わるまでストリームを一時停止してから再開できますか?それは安全ですか?

  2. 私の検証が失敗した場合は、res.send(何らかのエラー)を返すように計画します。リクエストストリーム内の残りのチャンクをすべて適切にクリアするか、それ以上のことを行う必要がありますか?任意の助け

おかげで...

答えて

1
module.exports = function(req, res, next) { 
    logger.info("file converter executing..."); 
    req.pause(); 
    req.on('data',function(chunk){ 

    // Read a line from the chunk 
    var line = readALine(req, chunk); 
    while ((line = readALine(req, chunk)) !== null) { 

     // ignore comment lines and blank lines... 
     if (line.indexOf("#") === 0 || line.length === 0) continue; 
     //take a callback to know when validation is complete 
     result = processLine(req, line, function(err, resp){ 
     if(err) return next(err); 
     req.resume();  
}); 
    } 
    }); 

    /** EOF: request stream -- move processing to next layer. **/ 
    req.on('end', function() { 
    console.log("handing control to next middle ware..."); 
    return next(); 
    }); 

}; 
+0

良い答え。もっと探検した後、私は「データ」イベントではなく、プル型の読書をしなければならないと思う。この方法では、データを私にプッシュする代わりに、自分が望むものだけを消費することができます。 –

関連する問題