我在关于nodejs的练习中发现了一些有趣的行为。
目的是将请求的POST数据转换为大写并使用流发回。
我的问题是我在这两段代码之间没有相同的行为(转换函数只是将buf
和queue
转换为大写):
var server = http.createServer(function (req, res) {
var tr = through(transform);
if (req.method === 'POST') {
req.pipe(tr).pipe(res);
}
});
var tr = through(transform);
var server = http.createServer(function (req, res) {
if (req.method === 'POST') {
req.pipe(tr).pipe(res);
}
});
第一个是正确的并且给了我:
ACTUAL EXPECTED
------ --------
"ON" "ON"
"THEM" "THEM"
"BUT," "BUT,"
...
我的版本tr
var outside:
ACTUAL EXPECTED
------ --------
"QUICK." "QUICK."
"TARK'S" "TARK'S"
"QUICK." !== "BIMBOOWOOD"
"TARK'S" !== "BIMBOOWOOD"
"BIMBOOWOOD" !== "SO"
"BIMBOOWOOD" !== "SO"
...
有关信息转换function
:
function transform(data) {
this.queue(data.toString().toUpperCase());
}
答案 0 :(得分:1)
var http = require('http')
var through = require('through')
var server = http.createServer(function(req, res) {
console.error("Been called")
if (req.method != 'POST') return res.end('send me a POST\n');
var tr = through(function(buf){
this.queue(buf.toString().toUpperCase())
})
req.pipe(tr).pipe(res)
})
server.listen(parseInt(process.argv[2]));
运行此示例。请注意console.error调用。 createServer requestListener被调用两次,因此两个实例是' tr'正在创建。如果' tr'在回调之外创建只有一个。当请求和写入不按我们变得奇怪的顺序发生时,这会导致意外行为。
我怀疑这不是针对直通模块的行为。
答案 1 :(得分:0)
问题中的评论是正确的,这是一个异步问题(根据我自己的经验,对于Node新手来说,这是最大的陷阱)。
PSB的解决方案是正确的,但我希望能够将实例分解为单独的函数,而不必在createServer回调函数中定义它。
需要将through实例包装在一个闭包中,以便this.queue保持预期的上下文。
var http = require('http');
var through = require('through');
var server = http.createServer(function(req,res){
if(req.method==='POST'){
req.pipe(tr()).
pipe(res);
}
});
server.listen(process.argv[2]);
var tr = function(){
return(through(
function(buf){
this.queue(buf.toString().toUpperCase());
})
);
};