在Http.get中,什么'response.on('data')和在javascript中使用

In Http.get, what's the difference between response.on('data') and using the bl library in javascript?

本文关键字:data 和在 javascript on 什么 get Http response      更新时间:2023-09-26
var http = require('http');
var bl = require('bl');
var url = process.argv[2];
http.get(url, function(res) {
  res.pipe(bl(function(err, data) {
    var dataString = data.toString();
    var dataCount = dataString.length
    console.log(dataCount);
    console.log(dataString);
  }));
})
   // 
// http.get(url, function(res) {
//   res.on('data', function(data) {
//     var dataString = data.toString();
//     var dataCount = dataString.length
//     console.log(dataCount);
//     console.log(dataString);
//   });
// })

这是来自节点学校挑战(learnyounode(。这是练习8。

注释掉的代码输出每个单独的单词,似乎是将数据分解,而不是聚合数据。我试图找到解释这种行为的文档,但我做不到。有人能告诉我们发生了什么吗?

res是一个可读流,这意味着当它读取了一些数据时,它将发出data事件。这不一定是所有数据,它可能会被调用多次(直到调用end事件或error事件表示出现问题为止(。

这基本上就是bl所做的(在您的示例中(:它收集所有数据,当所有数据都被读取后,它调用您传递的回调函数

如果没有bl,代码将如下所示:

http.get(url, function(res) {
  var buffers = [];
  res.on('data', function(data) {
    buffers.push(data);
  }).on('end', function() {
    var dataString = Buffer.concat(buffers).toString();
    var dataCount  = dataString.length
    console.log(dataCount);
    console.log(dataString);
  }).on('error', function(err) {
    ...handle the error...
  });
});

换句话说:传入数据收集在buffers阵列中,当触发end事件时(意味着所有数据都已读取(,数据缓冲区连接在一起形成最终的数据缓冲区。