我正在编写一个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或程序的内部缓存。因此,验证是异步的。
因此,当我处理一大块数据时,我不希望从流中接收任何其他事件,直到我完成当前块的验证。
我的问题:
我是否正确地假设pause(),resume()API适用于此处?所以,我可以暂停流,直到异步验证的承诺完成,然后恢复它?安全吗?
假设第一个查询是正确的,如果我的验证失败,则计划返回res.send(某些错误)。它会正确清除请求流中的所有剩余块,还是应该做更多其他事情?
感谢您的帮助......
答案 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();
});
};