使用 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});
}
});
}
上面的代码读取整个文件,然后在读取整个文件后将请求的行数添加到响应中。这很糟糕,有更好的方法吗?任何建议都会很高兴得到满足。
(上面代码的一个问题是它写出了日志的最后几行,但这些行的顺序相反......)
一种可能的方法是:
process.exec('tail -r ' + file_path).pipe(process.stdout);
但该语法不正确 - 所以我的问题是 - 如何将该命令的结果传输到 Node.js 中的数组中并最终传输到 JSON HTTP 响应中?
我创建了一个名为fs-backwards-stream
这可能会满足您的需求。https://www.npmjs.com/package/fs-backwards-stream https://www.npmjs.com/package/fs-backwards-stream
如果您需要按行而不是字节块解析结果,您应该使用该模块fs-reverse
https://www.npmjs.com/package/fs-reverse https://www.npmjs.com/package/fs-reverse or
这两个模块都可以流式传输,您可以简单地读取文件的最后 n 个字节。
这是一个使用普通节点 fs api 且没有依赖项的示例。
https://gist.github.com/soldair/f250fb497ce592c3694a https://gist.github.com/soldair/f250fb497ce592c3694a
希望有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)