【发布时间】:2015-09-04 04:14:02
【问题描述】:
这实际上是 Node.js 教程中的第 8 题 ([https://github.com/workshopper/learnyounode][1])
目标: 编写一个程序,对作为第一个命令行参数提供给您的 URL 执行 HTTP GET 请求。从服务器收集所有数据(不仅仅是第一个“数据”事件),然后将两行写入控制台(stdout)。
您编写的第一行应该只是一个整数,表示从服务器接收到的字符数。第二行应包含服务器发送的完整字符串。
所以这是我的解决方案(它通过了,但与官方解决方案相比看起来更丑)。
var http = require('http'),
bl = require('bl');
var myBL = new bl(function(err, myBL){
console.log(myBL.length);
console.log(myBL.toString());
});
var url = process.argv[2];
http.get(url, function(res){
res.pipe(myBL);
res.on('end', function(){
myBL.end();
});
});
官方解决方案:
var http = require('http')
var bl = require('bl')
http.get(process.argv[2], function (response) {
response.pipe(bl(function (err, data) {
if (err)
return console.error(err)
data = data.toString()
console.log(data.length)
console.log(data)
}))
})
我很难理解官方解决方案的工作原理。我主要有两个问题:
bl 构造函数期望第二个参数是 bl (根据 bl 模块的文档, [https://github.com/rvagg/bl#new-bufferlist-callback--buffer--buffer-array-][2]), 但什么是数据?它不知从何而来。它应该是未定义的 当它被传递来构造 bl 实例时。
什么时候是
bl.end()叫?我看不到bl.end()的名字在哪里......
希望有人能对这些问题有所了解。 (我知道我应该阅读源代码,但你知道......)
[1]: https://github.com/workshopper/learnyounode
[2]: https://github.com/rvagg/bl#new-bufferlist-callback--buffer--buffer-array-
【问题讨论】:
标签: javascript node.js stream pipe