【问题标题】:Append text to a node.js stream on the go随时随地将文本附加到 node.js 流
【发布时间】:2015-02-10 03:03:41
【问题描述】:

我正在使用fs.createReadStream() 读取文件,然后将它们通过管道传递给响应。

我想在提供 HTML 文件时添加一个小的 Javascript 函数。

我能想到的唯一方法是将文件读入字符串,将文本附加到字符串,然后将字符串流式传输到响应,但我认为可能有更好/更快的方法来做到这一点。

有没有办法让我随时随地将文本附加到文件中?

【问题讨论】:

  • 您可以使用through 之类的方法来执行此操作。它需要一个读写函数,让您可以转换流,而无需将大型数组存储在内存中。
  • @MatthewBakaitis 感谢您的建议。在 github 上阅读并查看了它的问题后,我看到它的开发人员推荐 through2 用于类似于我的案例。所以,主要感谢你,我现在正在使用 through2 并且问题已经解决:) 你应该把它变成一个 anwser 让我接受它吗?
  • 我认为这最适合作为评论。这不是一个详细的代码问题,通常最好作为详细的答案。您可能想要编辑您的问题,在最后添加一点,说明您通过 cmets 找到了 through2,任何通过搜索找到您的问题的人...

标签: javascript node.js stream node.js-stream


【解决方案1】:

在@Matthew Bakaitis 建议使用through 之后,在阅读了一段时间并检查了github 上的问题后,我发现through 的开发人员推荐through2 对于与我类似的情况。

使用finish回调更好地实现

let str_to_append="Whatever you want to append"

let through_opts = { "decodeStrings": false, "encoding": "utf8" }

let chunk_handler = function (chunk, enc, next) {
    next(null, chunk)
}

let finish_handler = function (done) {
    this.push(str_to_append)
    done()
}

let through_stream = through2.ctor(through_opts, chunk_handler, finish_handler)

旧实现

这就是我实施解决方案的方式:

var through2 = require("through2");

var jsfn="<script>function JSfn(){ return "this is a js fn";}</script>";

var flag=0;

fileStream.pipe( 
    through2( {"decodeStrings" : false, "encoding": "utf8"},function(chunk, enc) {
        if(flag===0) {
            var tempChunk=chunk;
            chunk=jsfn;
            chunk+=tempChunk;
            flag=1;
        }
        this.push(chunk);
    })
).pipe(res);

选项decodeStrings 必须设置为false,以便数据块是字符串而不是缓冲区。这与stream api的transform函数有关,与through2无关。

更多信息transform

【讨论】:

    猜你喜欢
    • 2016-02-26
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 2018-06-30
    • 1970-01-01
    相关资源
    最近更新 更多