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

我正在通过一些Learnyounode / nodeschool的例子,希望更好地理解stream转换。 我使用http.createServer()在节点中创build了一个简单的http服务器。 我希望能够先理解stream,而不必依赖像helper或helper这样的helper库。 如果可能的话,我更喜欢“本地到节点”,并且以这种方式更好地理解节点中的stream式概念。

给定一个POST请求(在这个学习案例中保证),我想要使用.toUpperCase()将请求正文中的字符转换为大写字符。 我对JS很熟悉,很容易find这个部分,但是我的困惑主要来自于为什么stream向response的stream没有被转换。

我能够log()出转换的字符,但由于某种原因,我没有看到他们不会被返回为实际转换的字符。 我知道.toUpperCase()不会影响实际的string本身,但是我正在返回这个值,所以它似乎并不是我的困惑所在(但请帮我澄清,如果我错了) 。 感谢大家!

POST上的示例input

短发

拉里

预期产出

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) 

编辑 我学到了什么:根据下面接受的答案,不是所有的节点支持stream都自己转换。 当你需要对可读stream(或其他类似的types)执行转换时,创build一个stream.transform()和pipe来代替。

可读stream不会自行支持转换。

你需要创build一个_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); })