我是Node js的新手。我正在尝试使用节点js将大型CSV文件导入到mongoDB中。我的方法名称是' saveCSVintoDB '。我在这个方法中使用csvtojson转换器来解析文件。由于该文件有超过100万条记录,转换器大约需要2分钟来解析整个文件。同时,我的节点js方法' saveCSVintoDB '正在被再次请求并且解析重新开始。我不希望这发生。我不会用较小的文件来解决这个问题,因为它们的解析速度要快得多,下一个请求也会从那里接管。
问题仅在解析发生时等待约2分钟。我不明白这种行为。我坚持了很久。有些人可以解释一下并提出一些可能的选择吗?
谢谢, 纳雷什
答案 0 :(得分:0)
您可以尝试添加时间戳来检查第二次请求的时间:
console.log("got request @" + new Date());
由于处理需要时间,因此请求将超时,因此会触发另一个请求。您需要增加超时间隔。
在香草JS中:
var server = http.createServer(function (req, res) { ... });
server.timeout = 120000;
如果您使用的是Express,则可以使用Connect Middleware for Timeout支持:
var timeout = express.timeout // express v3 and below
var timeout = require('connect-timeout'); //express v4
app.use(timeout(120000));
修改:处理多个请求问题:
SO上的大部分答案暗示第二个请求是针对favicon的。但是我在我的本地机器上检查过,在大约2分钟的间隔之后发出的第二个请求不是这种情况,打印req.url
指向同一页面/saveCollection
。
我可以建议在本地机器上运行的黑客攻击:
res.writeHead(200, { 'Content-Type': 'application/json' });
。这将花费我们2分钟的时间。以下是一个例子:
router.post('/saveCollection', function(req, res,next) {
console.log("col name:"+req.param("collName"));
var fileStream=fs.createReadStream(req.files.myFile.path);
var csvConverter=new Converter({constructResult:false});
csvConverter.on("end_parsed",function() {
console.log('file completely parsed:');
clearInterval(si);
res.write(", 'success':true}");
res.end();
});
i = 0;
var si = setInterval(function() {
i++;
res.write(",'dummy" + i + "' : 'piece'");
}, 1000 * 60); //this should be kept a little less than two minutes
console.log('before parsing');
res.writeHead(200, { 'Content-Type': 'application/json' });
res.write("{'dummy':'piece'");
fileStream.pipe(csvConverter);
});
我无法想到这样做的其他方法。即使您忽略第二个请求,第一个请求仍然会过期,浏览器可能会显示错误。
还有另一项工作,一开始计算并在计算开始后立即发送响应,然后使用套接字检查状态。