Node.js逐行读取文件并在末尾获取其内容

5
我希望使用Node.js逐行读取文件,并在完成后将返回的结果作为JSON字符串获取。我试图这样做,但最终控制台打印的是未定义而不是列表。我已经获得了列表和Promise结尾,但如何将其返回给main.js中的调用函数?
我有一个main.js文件:
var fct = require('./romlist-parser');

console.log(fct.myfunction());

"romlist-parser.js"的内容如下:
var fs = require('fs');
var readline = require('readline');

exports.myfunction = function() {

    var promise = new Promise(function(resolve,reject) {
        var rd = readline.createInterface({
            input: fs.createReadStream('Atari 2600.txt'),
            console: false
        });

        var games = [];

        rd.on('line', function(line) {
            var arr = line.split(";");
            games.push({name:arr[0], title:arr[1]});
        });

        rd.on('close', function() {
            var json = JSON.stringify(games);
            resolve(games);
        });

    });

    promise.then((resolveResult) => {
        console.log(resolveResult);
        return resolveResult;
    });
};

你能说一下为什么你使用 readlinestreamPromise 吗?在你的情况下,一个简单的 fs.readFile 不能胜任吗? - RaphaMex
这个 OP 中的第一个控制台日志打印了函数返回的值。由于该函数没有返回任何内容,因此该值为未定义。如果您随后没有看到结果被记录,可能是由于读取错误(也许文件未找到)引起的。您可以使用 rd.on('error' ... 发现这一点。 - danh
3个回答

2

试试这个:

exports.myfunction = function() {

    var promise = new Promise(function(resolve,reject) {

        var games = [];
        var rl = readline('./Atari 2600.txt'); // provide correct file path

        rl.on('line', function (line, lineCount, byteCount) {
            // console.log(lineCount, line, byteCount);
            var arr = line.split(";");
            games.push({name:arr[0], title:arr[1]});
        })
        .on('close', function() {
            var json = JSON.stringify(games);
            resolve(games); // resolve(json); may be?? 
        })
        .on('error', function (e) {
            console.log("error", e);
            // something went wrong
        });
    });

    promise.then((resolveResult) => {
        console.log(resolveResult);
        return resolveResult;
    });
};

附言:这段代码可以进一步改进,但为了简单和易懂起见,答案仅限于帖子中发布的样式/代码。否则,它可能会因样式而异。


0
我会将设置和累加结果的变量移动到封闭作用域中,然后最重要的是从创建它的函数中返回 Promise。所以...
exports.myfunction = function(filename) {
    let games = [];
    let rd = readline.createInterface({
        input: fs.createReadStream(filename),
        console: false
    });

    return new Promise(function(resolve,reject) {
        rd.on('line', function(line) {
            var arr = line.split(";");
            games.push({name:arr[0], title:arr[1]});
        });

        rd.on('close', function() {
            var json = JSON.stringify(games);
            resolve(games);
        });
        // on 'error' call reject(error)
    });
};

// then elsewhere

const fct = require('./romlist-parser');

function someFunction() {
    let promise = fct.myfunction('Atari 2600.txt');
    return promise.then(result => {
        console.log(result);
        return resolveResult
    });
}

-1

我也需要一种好的方式来处理大文件中的行。

所以我做了这个。你可以轻松地逐行在文件、流、字符串、缓冲区中迭代。

它还支持反向模式!

请尝试一下,如果你喜欢它,请给我点赞!

https://github.com/sharpart555/nexline

const nl = nexline({
  input: fs.openSync(path_to_file, 'r'), // input can be file, stream, string and buffer
});

console.log(await nl.next()); // 'foo'
console.log(await nl.next()); // 'bar'
console.log(await nl.next()); // 'baz'
console.log(await nl.next()); // null, If all data is read, then return null

请查看此链接 - https://www.npmjs.com/package/n-readlines - Manohar Reddy Poreddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接