node.js fs - 流文件"向后" - 从下到上

Ale*_*lls 8 javascript node.js

使用Node.js,将文件从文件系统流式传输到Node.js的最佳方法是什么,但是从底部到顶部向后读取它?我有一个大文件,如果我只想要最后10行,从顶部读取似乎没有多大意义.这可能吗?

现在我有这个可怕的代码,我们用浏览器执行GET请求来查看服务器日志,并传递一个查询字符串参数来告诉服务器我们想要读取的日志文件末尾有多少行:

function get(req, res, next) {

    var numOfLinesToRespondWith = req.query.num_lines || 10;

    var fileStream = fs.createReadStream(stderr_path, {encoding: 'utf8'});

    var jsonData = [];   //where jsonData gets populated
    var ret = [];

    fileStream.on('data', function processLineOfFileData(chunk) {
        jsonData.push(String(chunk));
    })
    .on('end', function handleEndOfFileData(err) {
        if (err) {
            log.error(colors.bgRed(err));
            res.status(500).send({"error reading from smartconnect_stdout_log": err.toString()});
        }
        else {

         for(var i = 0; i < numOfLinesToRespondWith; i++){
                ret.push(jsonData.pop());
           }

          res.status(200).send({"smartconnect_stdout_log": ret});

        }
    });
}
Run Code Online (Sandbox Code Playgroud)

上面的代码读取整个文件,然后在读取整个文件后将请求的行数添加到响应中.这很糟糕,有没有更好的方法呢?任何建议都会很乐意得到满足.

(上面代码的一个问题是它写出了日志的最后几行,但是行的顺序是相反的......)

一种可行的方法是:

process.exec('tail -r ' + file_path).pipe(process.stdout);
Run Code Online (Sandbox Code Playgroud)

但是这个语法是不正确的 - 所以我的问题就是 - 如何将该命令的结果传递到Node.js中的数组并最终传输到JSON HTTP响应中?

小智 8

我创建了一个fs-backwards-stream可以满足您需求的模块.https://www.npmjs.com/package/fs-backwards-stream

如果您需要通过行而不是字节块解析的结果,则应使用模块fs-reverse https://www.npmjs.com/package/fs-reverse

这两个模块流都可以简单地读取文件的最后n个字节.

这是一个使用普通节点fs apis并且没有依赖关系的示例.

https://gist.github.com/soldair/f250fb497ce592c3694a

希望有所帮助.