了解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()
,然后在req
和res
之间用另一个.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); })