将readstream管道传输到响应中使其一次性使用



现在我正在尝试使用Node readstreams和流转换来编辑HTML数据,然后再将其发送到客户端。是的,我知道模板引擎是存在的,不过这就是我现在使用的方法。我使用的代码如下:

const express = require('express')
const app = express()
const port = 8080
const fs = require('fs')
const Transform = require("stream").Transform
const parser = new Transform()
const newLineStream = require("new-line")
parser._transform = function(data, encoding, done) {
const str = data.toString().replace('</body>', `<script>var questions = ${JSON.stringify(require('./questions.json'))};</script></body>`)
this.push(str)
done()
}
app.get('/', (req, res) => {
console.log('Homepage served')
res.write('<!-- Begin stream -->n');
let stream = fs.createReadStream('./index.html')
stream.pipe(newLineStream())
.pipe(parser)
.on('end', () => {
res.write('n<!-- End stream -->')
}).pipe(res)
})

这只是一个粗略的草案,试图让这种方法发挥作用。现在,我遇到的问题是,第一次加载网页时,一切都很好,但每次加载后,我得到的html都是这样的:

<!-- Begin stream -->
<html>
<head></head>
<body></body>
</html>

流似乎被挂在了中间,因为大多数数据从未传输过,流也从未结束。我在控制台中注意到的另一件事是,在10次重新加载后,有一个警告,即[Transform]上有11个事件侦听器,并且可能存在内存泄漏。我曾尝试在readstream结束后清除readstream和解析器上的所有事件侦听器,但这并没有解决任何问题。有没有办法更改我的代码来解决这个问题?

原始StackOverflow帖子称这种方法来自

这里的问题是使用单个解析器和_transform((,而不是每次应用程序收到请求时都创建一个新的转换。把CCD_ 1和CCD_ 2放在CCD_。

相关内容

  • 没有找到相关文章

最新更新