我正在研究一些Learnyounode / nodeschool示例,我希望能够更好地理解流转换。我使用http.createServer()
在节点中创建了一个简单的http服务器。我希望首先能够很好地理解流,而不必依靠through
或through2
等辅助库。如果可能的话,我会更喜欢“本地到节点”,并以这种方式更好地理解节点中的流媒体概念。
鉴于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()并将其换行。
答案 0 :(得分:2)
可读流不支持自己的支持转换。
您需要创建stream.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);
})