Node.jsstream冒险课程6:声明一个variables与内联函数声明

学习Node.js和NodeSchool.io,我对以下两个代码段之间的差异感到困惑。 差异可能是基本的node.js或只是一般的js,所以我希望专家可以澄清这一点给我。

第六课接受的答案如下。 请注意,通过(…)进行内联pipe道。

var http = require('http'); var through = require('through'); var server = http.createServer(function (req, res) { if (req.method === 'POST') { req.pipe(through(function (buf) { this.queue(buf.toString().toUpperCase()); })).pipe(res); } else res.end('send me a POST\n'); }); server.listen(parseInt(process.argv[2])); 

我的解决scheme(失败)是声明一个variablestr如下所示:

 var http = require('http'); var through = require('through'); var tr = through(function(buf) { this.queue(buf.toString().toUpperCase()); }); var server = http.createServer(function (req, res) { if (req.method == 'POST') { req.pipe(tr).pipe(res); } else res.end(); }).listen(process.argv[2]); 

为什么这两个代码块产生不同的结果?

你的代码版本与作为正确的解决scheme提供的版本之间的根本区别在于,在你的版本中,你只能创build一次直通stream,这意味着它在你第一次调用它的时候就会起作用,而第二次你做请求,你的stream已经被耗尽了(也就是说,它已经从前一次调用中结束了),所以它会被阻塞,因为它再也不会结束了。

因此,每次都需要一个新的直通stream。 例如,如果你是这样写的,你就不会有这个问题:

 var http = require('http'); var through = require('through'); var tr = function(){ return through(function(buf) { this.queue(buf.toString().toUpperCase()); }); }; var server = http.createServer(function (req, res) { if (req.method == 'POST') { req.pipe(tr()).pipe(res); } else res.end(); }).listen(process.argv[2]);