【问题标题】:Understanding simple stream transforms in Node.js了解 Node.js 中的简单流转换
【发布时间】:2014-12-30 06:17:09
【问题描述】:

我正在研究一些 Learnyounode/nodeschool 示例,希望能更好地了解流转换。我使用http.createServer() 在节点中创建了一个简单的http 服务器。我的希望是能够先充分理解流,而不必依赖像 throughthrough2 这样的辅助库。如果可能的话,我希望它更“本地到节点”,并通过这种方式更好地理解节点中的流概念。

给定一个 POST 请求(在本学习案例中得到保证),我想使用 .toUpperCase() 将请求正文中的字符转换为大写字符。我对 JS 足够熟悉,可以轻松找到这部分,但我的困惑主要源于为什么我是 .pipe()-ing 到 response 的流没有被转换。

我可以log() 输出转换后的字符,但由于某种原因,我没有看到它们没有作为实际转换的字符返回。我知道.toUpperCase() 不会影响实际的字符串本身,但我正在返回该值,所以这似乎不是我的困惑所在(但请帮助我澄清我是否错了)。谢谢大家!

POST 上的示例输入

鲍勃

拉里

预期输出

鲍勃

乔伊

拉里

实际输出:

鲍勃

拉里

我的简单服务器

var http = require('http')
var port = process.argv[2]

var server = http.createServer(function(req, res) {
  if (req.method != 'POST') {
    console.log('You have failed to comply with our stringent demands');
    return false
   }
  req.on('data', function(chunk) {
     return chunk.toString().toUpperCase()
  }).pipe(res);
})

server.listen(port)

编辑 我学到了什么: 根据下面接受的答案,并非节点中的所有流都支持自己的转换。当您需要对 readableStream(或其他类似类型)执行转换时,请创建一个 stream.transform() 并改为管道。

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    可读流本身不支持转换。

    您需要创建一个stream.Transform 并定义它的_transform(),然后将它与另一个.pipe() 链接在reqres 之间:

    var stream = require('stream');
    
    var server = http.createServer(function(req, res) {
      // ...
    
      var uppercase = new stream.Transform();
      uppercase._transform = function (data, enc, cb) {
        cb(null, data.toString().toUpperCase());  
      };
    
      req.pipe(uppercase).pipe(res);
    })
    

    【讨论】:

    • 啊。那讲得通。 1 个后续问题:我读到 streams 模块不稳定(我知道它的稳定性指数为 2),人们建议使用其他库。相信该建议通常是好的还是更多的是逐案和streams可以在某种程度上依赖?
    • Node 中的所有流类型通常都是这样吗?转换是否分离到它们自己关注的领域?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 2015-10-27
    • 1970-01-01
    • 2019-07-25
    • 2014-05-14
    • 1970-01-01
    • 2014-07-05
    相关资源
    最近更新 更多