NodeJS使用流和异步验证处理文件上载

时间:2016-07-16 09:32:21

标签: node.js sockets express

我正在编写一个expressJS网络应用程序来处理文件上传。可接收文件包含我需要即时处理和验证的数据。

我正在处理它如下:

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();
  });

};

在processLine()函数中,我必须验证每行传入数据。但问题是验证可能是异步的,因为我正在尝试检查最初在DB中的某些值,但是延迟加载到Redis Cache或程序的内部缓存。因此,验证是异步的。

因此,当我处理一大块数据时,我不希望从流中接收任何其他事件,直到我完成当前块的验证。

我的问题:

  1. 我是否正确地假设pause(),resume()API适用于此处?所以,我可以暂停流,直到异步验证的承诺完成,然后恢复它?安全吗?

  2. 假设第一个查询是正确的,如果我的验证失败,则计划返回res.send(某些错误)。它会正确清除请求流中的所有剩余块,还是应该做更多其他事情?

  3. 感谢您的帮助......

1 个答案:

答案 0 :(得分: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();
  });

};