关于http模块里的,request方法的一些疑问。
发布于 7 年前 作者 CRAZYFAKE 3525 次浏览 来自 问答

情况是这样的,我写了一个简单的本地服务,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}`)
})

打印信息如下: image.png 我看了源码,看到他移除了dataend的监听,参考代码如下: 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(){ } )方法始终会执行,我目前没有找到相关代码和证据,求大神帮忙解释一下,谢谢~~~~

回到顶部