最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Read strings line by line from Buffer instance in Node.js module - Stack Overflow

programmeradmin4浏览0评论

I have a Node.js module which exports two functions init(data) , where data is Buffer ,and test(word) , where word is a string.

I would like to read lines from data Buffer instance line by line inside test() function .

I have no experience in Node.js, only JS. All I come to know from this stack is how to export multiple function from Node.js module.

Here is function declaration so far:

module.exports = {
    init: function(data) {

    },
    test: function(word) {

    }
}

I have a Node.js module which exports two functions init(data) , where data is Buffer ,and test(word) , where word is a string.

I would like to read lines from data Buffer instance line by line inside test() function .

I have no experience in Node.js, only JS. All I come to know from this stack is how to export multiple function from Node.js module.

Here is function declaration so far:

module.exports = {
    init: function(data) {

    },
    test: function(word) {

    }
}
Share Improve this question edited Jun 24, 2019 at 15:30 Yves M. 31k24 gold badges109 silver badges149 bronze badges asked Apr 27, 2016 at 17:27 Divyanshu JimmyDivyanshu Jimmy 2,7425 gold badges35 silver badges51 bronze badges
Add a comment  | 

1 Answer 1

Reset to default 22

according to your comment, data is instanceof Buffer, and it contains a dictionary with one english word per line. So, now you can convert data to array of string, splitting by new line characters. with module format:

module.exports.init = function (data) {
    if (!(data instanceof Buffer)) {
        throw new Error('not a instanceof Buffer');
    }
    this.currentData = data.toString().split(/(?:\r\n|\r|\n)/g);
};

module.exports.test = function (word) {
    // for example
    var yourTestMethod = function (lineNumber, lineContent, testWord) {
        return true;
    };
    if (this.currentData && this.currentData.length) {
        for (var line = 0; line < this.currentData.length; line++) {
            if (yourTestMethod(line, this.currentData[line], word)) {
                return true;
            }
        }
    }
    return false;
};

if you save this code as testModule.js, you can use this module in main code like:

// load module
var testModule = require('./testModule.js');

// init
var buf = new Buffer(/* load dictionaly */);
testModule.init(buf);

// test
console.log(testModule.test('foo'));

I think it is more simple. thanks.


(old answer)

I think you can use readline module. But readline accepts a stream, not a buffer. So it needs to convert. for example.

var readline = require('readline');
var stream = require('stream');

// string to buffer
var baseText = 'this is a sample text\n(empty lines ...)\n\n\n\nend line:)';
var buf = new Buffer(baseText);

// http://stackoverflow.com/questions/16038705/how-to-wrap-a-buffer-as-a-stream2-readable-stream
var bufferStream = new stream.PassThrough();
bufferStream.end(buf);

var rl = readline.createInterface({
    input: bufferStream,
});

var count = 0;
rl.on('line', function (line) {
    console.log('this is ' + (++count) + ' line, content = ' + line);
});

then output is:

> node test.js
this is 1 line, content = this is a sample text
this is 2 line, content = (empty lines ...)
this is 3 line, content =
this is 4 line, content =
this is 5 line, content =
this is 6 line, content = end line:)

how is that?

发布评论

评论列表(0)

  1. 暂无评论