Javascript 节点流逐行关闭事件
我收到一个来自http post的大文件。我需要从这个文件中取出每一行并将其插入数据库。通过一次插入500行左右的行,这样做要快得多,所以我有:Javascript 节点流逐行关闭事件,javascript,node.js,readline,Javascript,Node.js,Readline,我收到一个来自http post的大文件。我需要从这个文件中取出每一行并将其插入数据库。通过一次插入500行左右的行,这样做要快得多,所以我有: var readline = require('readline'); var insertSize = 500; var records = []; var reader = readline.createInterface({ input: inputStream }); reader.on('line', function(line) {
var readline = require('readline');
var insertSize = 500;
var records = [];
var reader = readline.createInterface({
input: inputStream
});
reader.on('line', function(line) {
reader.pause();
var entry = line.split('\t');
if (entry.length != 3) return reader.resume();
records.push({
first: entry[0],
second: entry[1],
third: entry[2]
});
if (records.length < insertSize) return reader.resume();
database.create(records).exec(function (err) {
if (err) return res.serverError(err);
records.length = 0;
reader.resume();
});
});
reader.on('error', function(err) {
return res.serverError(err);
});
reader.on('close', function() {
database.create(records).exec(function (err) {
if (err) return res.serverError(err);
return res.ok();
});
});
var readline=require('readline');
var-insertSize=500;
var记录=[];
var reader=readline.createInterface({
输入:inputStream
});
reader.on('line',函数(line){
reader.pause();
var entry=line.split('\t');
if(entry.length!=3)返回reader.resume();
记录。推送({
第一:条目[0],
第二:条目[1],
第三:条目[2]
});
if(records.length
根据文档,在
pause()
之后仍然可以触发行
和关闭
事件。我看到了这种情况,因为close
事件是在database.create()
在行中完成之前触发的。有没有更好的方法来处理这个问题<代码>逐行
会很好,但它不能将流作为输入。谢谢。通过使用split
我可以避免这个问题。暂停流时不会触发end
事件
var split = require('split');
var insertSize = 500;
var records = [];
readStream.pipe(split())
.on('error', function (err) {
return res.serverError(err);
})
.on('data', function (line) {
var _this = this;
this.pause();
var entry = line.split('\t');
if (entry.length != 3) return this.resume();
records.push({
first: entry[0],
second: entry[1],
third: entry[2]
});
if (records.length < insertSize) return this.resume();
database.create(records).exec(function (err) {
if (err) return res.serverError(err);
records.length = 0;
_this.resume();
});
})
.on('end', function () {
database.create(records).exec(function (err) {
if (err) return callback(err);
return res.ok();
});
});
var split=require('split');
var-insertSize=500;
var记录=[];
readStream.pipe(split())
.on('error',函数(err){
返回res.serverError(err);
})
.on('数据',函数(行){
var_this=这个;
这个。暂停();
var entry=line.split('\t');
如果(entry.length!=3)返回此.resume();
记录。推送({
第一:条目[0],
第二:条目[1],
第三:条目[2]
});
if(records.length
通过使用split
我能够避免这个问题。暂停流时不会触发end
事件
var split = require('split');
var insertSize = 500;
var records = [];
readStream.pipe(split())
.on('error', function (err) {
return res.serverError(err);
})
.on('data', function (line) {
var _this = this;
this.pause();
var entry = line.split('\t');
if (entry.length != 3) return this.resume();
records.push({
first: entry[0],
second: entry[1],
third: entry[2]
});
if (records.length < insertSize) return this.resume();
database.create(records).exec(function (err) {
if (err) return res.serverError(err);
records.length = 0;
_this.resume();
});
})
.on('end', function () {
database.create(records).exec(function (err) {
if (err) return callback(err);
return res.ok();
});
});
var split=require('split');
var-insertSize=500;
var记录=[];
readStream.pipe(split())
.on('error',函数(err){
返回res.serverError(err);
})
.on('数据',函数(行){
var_this=这个;
这个。暂停();
var entry=line.split('\t');
如果(entry.length!=3)返回此.resume();
记录。推送({
第一:条目[0],
第二:条目[1],
第三:条目[2]
});
if(records.length