关于http模块里的,request方法的一些疑问。
情况是这样的,我写了一个简单的本地服务,express
搭建的返回一个简单的字符串res.json("Hello world!")
,
然后我用http
模块的request
方法去请求我这个接口,期间调用了request.abort()方法,取消请求。
但是最后的response.on('end', function(){ } )
方法接收到了空的返回值。具体的请求接口代码如下:
const http = require('http')
const https = require('https')
const print = console.log
let TimRestAPI = {}
const nei = {
host: '127.0.0.1',
path: '/',
port: 3011
}
var requestOpts = {
method: 'get',
host: nei.host,
port: nei.port,
path: nei.path
}
TimRestAPI.request = function (reqBody, callback) {
var chunkList = []
var req = http.request(requestOpts, function (res) {
// res是一个IncomingMessage实例
res.setEncoding('utf8')
res.on('data', function (chunk) {
console.log('Get data there')
chunkList.push(chunk)
})
req.abort()// 标记请求为终止。 调用该方法将使响应中剩余的数据被丢弃且 socket 被销毁。
res.on('end', function (err,res) {
// res.on('end') 这个方法始终执行,但我目前没有找到他为什么会一直执行
rspBody = chunkList.join('')
try {
var rspJsonBody = JSON.parse(rspBody)
if (callback) {
callback(rspJsonBody)
}
} catch (err) {
if (callback) {
callback(err.message)
}
}
})
})
req.on('error', function (err) {
if (callback) {
callback(err.message)
}
})
req.on('abort', function (msg) {
if (callback) {
callback(new Error('abort'), undefined)
}
})
req.end()
}
// module.exports = TimRestAPI
let count = 0
TimRestAPI.request({}, function (err, res) {
print(`${count++} \t${err} \t${res}`)
})
打印信息如下:
我看了源码,看到他移除了data
和end
的监听,参考代码如下:
https://github.com/nodejs/node/blob/master/lib/_http_client.js#L416
https://github.com/nodejs/node/blob/master/lib/_http_client.js#L394
但是response.on('end', function(){ } )
方法始终会执行,我目前没有找到相关代码和证据,求大神帮忙解释一下,谢谢~~~~