了解Node.js中的简单流转换

时间:2014-12-29 20:29:43

标签: javascript node.js

我正在研究一些Learnyounode / nodeschool示例,我希望能够更好地理解流转换。我使用http.createServer()在节点中创建了一个简单的http服务器。我希望首先能够很好地理解流,而不必依靠throughthrough2等辅助库。如果可能的话,我会更喜欢“本地到节点”,并以这种方式更好地理解节点中的流媒体概念。

鉴于POST请求(在此学习案例中有保证),我想使用.toUpperCase()将请求正文中的字符转换为大写字符。我对JS很熟悉,发现这部分容易,但我的困惑主要源于为什么我.pipe()的流不会转换为response

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

POST上的示例输入

鲍勃

拉​​里

预期输出

BOB

JOE

LARRY

实际输出:

鲍勃

拉​​里

我的简单服务器

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()并将其换行。

1 个答案:

答案 0 :(得分:2)

可读流不支持自己的支持转换。

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

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);
})