节点流逐行关闭事件
Node stream line by line close event
我从 http post 收到一个大文件。我需要从这个文件中取出每一行并将其插入到数据库中。通过一次插入 500 行左右来执行此操作要快得多,所以这就是我所拥有的:
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();
});
});
根据文档,line
和 close
事件仍然可以在 pause()
之后触发。我看到这种情况发生了,因为 close
事件在 line
事件中的 database.create()
完成之前被触发。有没有更好的方法来处理这个问题? line-by-line
会很好,但它不能将流作为输入。谢谢。
通过使用 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();
});
});
我从 http post 收到一个大文件。我需要从这个文件中取出每一行并将其插入到数据库中。通过一次插入 500 行左右来执行此操作要快得多,所以这就是我所拥有的:
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();
});
});
根据文档,line
和 close
事件仍然可以在 pause()
之后触发。我看到这种情况发生了,因为 close
事件在 line
事件中的 database.create()
完成之前被触发。有没有更好的方法来处理这个问题? line-by-line
会很好,但它不能将流作为输入。谢谢。
通过使用 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();
});
});