Đây thực sự là số 8 tập thể dục từ các hướng dẫn Node.js ([https://github.com/workshopper/learnyounode][1])Đường ống (luồng Node.js) và bl (BufferList) hoạt động cùng nhau như thế nào?
Mục tiêu: Viết chương trình thực hiện một yêu cầu HTTP GET đến một URL được cung cấp cho bạn như Command- đầu tiên đối số dòng. Thu thập tất cả dữ liệu từ máy chủ (không chỉ là sự kiện "dữ liệu" đầu tiên) và sau đó viết hai dòng vào bảng điều khiển (stdout).
Dòng đầu tiên bạn viết chỉ là số nguyên thể hiện số lượng ký tự nhận được từ máy chủ. Dòng thứ hai phải chứa chuỗi ký tự hoàn chỉnh được gửi bởi máy chủ.
Vì vậy, đây là giải pháp của tôi (Nó vượt qua nhưng trông xấu hơn so với giải pháp chính thức).
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();
});
});
Các giải pháp chính thức:
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)
}))
})
tôi gặp khó khăn tìm hiểu cách các giải pháp chính thức hoạt động. Tôi có chủ yếu là hai câu hỏi:
Các constructor bl hy vọng đối số thứ 2 là một thể hiện của bl (theo tài liệu hướng dẫn bl mô-đun của, [https://github.com/rvagg/bl#new-bufferlist-callback--buffer--buffer-array-][2]), nhưng dữ liệu là gì? Nó ra khỏi hư không. Nó sẽ không được xác định khi nó được truyền để xây dựng thể hiện bl.
khi nào là
bl.end()
được gọi? Tôi có thể thấy không có nơi nàobl.end()
được gọi là ...
Hy vọng ai đó có thể làm sáng tỏ những câu hỏi này. (Tôi biết tôi nên đã đọc mã nguồn, nhưng bạn biết ...)
[1]: https://github.com/workshopper/learnyounode
[2]: https://github.com/rvagg/bl#new-bufferlist-callback--buffer--buffer-array-
Về 'end', xem tại đây - https://github.com/rvagg/bl # ctor – levi
Cảm ơn cả hai! Thật vậy, xấu của tôi, tôi nên đọc tài liệu cẩn thận hơn. 1) tham số dữ liệu được sử dụng như một tham số đầu ra và bl không yêu cầu nó là một thể hiện của bl. (Tôi đã bị lừa bởi mô tả ở đây https://github.com/rvagg/bl#new-bufferlist-callback--buffer--buffer-array- – slowreader239
2) Đối với cuộc gọi kết thúc(), thực sự nó được cho là được gọi là bởi stream.pipe() https://nodejs.org/api/stream.html#stream_readable_pipe_destination_options – slowreader239