nodeschool Streams冒险[HTTP服务器]

时间:2014-07-24 15:44:36

标签: node.js

我在关于nodejs的练习中发现了一些有趣的行为。

目的是将请求的POST数据转换为大写并使用流发回。

我的问题是我在这两段代码之间没有相同的行为(转换函数只是将bufqueue转换为大写):

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

2 个答案:

答案 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());
                })
        );
};