gpt4 book ai didi

javascript - node.js fs - 流文件 "backwards"- 从下到上

转载 作者:数据小太阳 更新时间:2023-10-29 04:10:21 24 4
gpt4 key购买 nike

使用 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

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

这两个模块都流式传输您可以简单地读取文件的最后 n 个字节。

这里是一个使用普通 Node fs api 且没有依赖项的示例。

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

希望对您有所帮助。

关于javascript - node.js fs - 流文件 "backwards"- 从下到上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32234228/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com