我在NodeJS上测试一小块代码,它应该创建一个ClientRequest对象并触发三个事件:
以下是我正在测试的一大块代码:
var http = require('http');
var server = http.createServer();
var link = "www.asos.com";
// now that server is running
server.listen(1337, '127.0.0.1', function(){
tryMe();
});
function tryMe(){
var options = {
hostname: link,
port: 80,
method: "GET"
};
var asosRequest = http.request(options);
asosRequest.on("response", function(res){
console.log("response");
});
asosRequest.on('readable', function() {
console.log("readable");
});
asosRequest.on('end', function(){
console.log("Bey!");
});
asosRequest.end();
}
我无法弄清楚为什么“可读”和“结束”事件不会触发我的情况。 “response”事件正常工作并返回正确的信息和数据缓冲区。有什么我误解了数据流在节点中的工作方式吗?
NEW: 我使用节点版本v7.7.2。 如果我尝试“数据”事件,它也不会触发。
新p2:在仔细阅读NodeJS文档之后,我意识到我在一个错误的对象上调用了事件,我不得不在响应对象上调用它们。
答案 0 :(得分:0)
阅读完文档后,我清楚地知道我在错误的对象上调用方法: - 'response'事件仅在http.ClientRequest对象上触发,然后你有,响应事件回调有一个参数“response”,表示http.IncomingMessage的一个实例。这基本上是我需要调用“数据”,“可读”和“结束”事件的对象,因为它代表一个可读的流。
以下是NodeJs文档中的链接:
http.ClientRequest:https://nodejs.org/api/http.html#http_class_http_clientrequest
http.IncomingMessage: https://nodejs.org/api/http.html#http_class_http_incomingmessage
现在代码就像这样运行并运行:
var http = require('http');
var server = http.createServer();
var link = "www.asos.com";
// now that server is running
server.listen(1337, '127.0.0.1', function(){
tryMe();
});
function tryMe(){
var options = {
hostname: link,
port: 80,
method: "GET"
};
var asosRequest = http.request(options);
asosRequest.on("response", function(res){
res.on("data", function(data){
console.log("data");
});
res.on("readable", function(){
console.log("redable");
res.read();
});
res.on("end", function(){
console.log("end");
})
console.log("response");
console.log(res.statusCode);
console.log(res.statusMessage);
});
asosRequest.on('end', function(){
console.log("Bey!");
});
asosRequest.end();
}