Node.js中https.get正常运行但https.request报ECONNRESET错误如何解决
问题原因
你调用https.request之后没有手动调用req.end()方法来结束请求发送流程,导致请求一直没有实际发出,服务器端主动断开了连接,所以抛出ECONNRESET错误。
两者核心差异
https.get是https.request的便捷封装,内部默认设置请求方法为GET,且会在创建请求对象后自动调用req.end()完成请求发送,不需要手动操作。https.request是更底层的通用接口,支持所有HTTP方法,也支持发送请求体(比如POST的表单、JSON数据),所以需要你在组装完所有请求相关逻辑后,手动调用req.end()来告知Node.js你已经完成请求配置,可以把请求发送出去了。如果你没调用这个方法,请求会一直处于待发送状态,超时后服务端就会断开TCP连接,触发socket hang up的错误。
修复后的代码
只需要在runRequest方法的请求对象定义末尾新增req.end()即可:
async function runRequest () { return new Promise((resolve, reject) => { const req = https.request({ hostname: 'jsonplaceholder.typicode.com', method: 'GET', path: '/todos/1' }, (resp) => { console.log(`statusCode: ${resp.statusCode}`) const data = [] resp.on('data', (chunk) => { data.push(chunk) }) resp.on('end', () => { resolve(Buffer.concat(data).toString()) }) resp.on('error', (err) => { reject(err) }) }).on('error', (err) => { reject(err) }).on('timeout', (err) => { reject(err) req.abort() }).on('uncaughtException', (err) => { reject(err) req.abort() }) // 新增这行,手动结束请求发送 req.end() }) }
如果是POST等需要发送请求体的场景,你可以在调用req.end()之前通过req.write()方法写入请求体数据,全部写完后再调用req.end()即可。
内容的提问来源于stack exchange,提问作者egorovd
相关产品推荐
相关产品推荐

