Node.js请求超时致进程终止:实现仅记录错误不终止进程
解决Node.js HTTPS请求超时abort后进程终止的问题
我来帮你搞定这个问题!你遇到的进程终止问题,大概率是因为存在未被捕获的错误事件,或者代码里的.red方法依赖的工具没正确引入导致的未处理异常。咱们一步步来修复:
问题分析
- 你代码里的
console.log(timeout.red);如果没有提前引入chalk库(或者类似的颜色工具),会直接抛出TypeError: "timeout".red is not a function,这个错误没被捕获就会终止进程。 - 除了
request对象的error事件,socket对象本身也可能触发error事件,如果没监听的话,同样会导致进程崩溃。
修复后的代码
const https = require('https'); // 如果要用颜色输出,记得引入chalk const chalk = require('chalk'); const options = { // 你的请求配置,比如hostname、path、method等 }; const request = https.request(options, (response) => { // 处理响应逻辑 response.on('data', (chunk) => { // 处理响应数据 }); response.on('end', () => { // 响应结束逻辑 }); }); request.on('socket', (socket) => { socket.setTimeout(100); socket.on('timeout', () => { console.log(chalk.red('timeout')); // 正确使用chalk的方式 request.abort(); }); // 必须监听socket的error事件,避免未处理错误导致进程终止 socket.on('error', (e) => { console.log(`socket error: ${e.message}`); }); }); request.on('error', (e) => { // 这里捕获请求的错误,比如abort后的socket hang up错误 console.log(`problem with request: ${e.message}`); }); // 记得发送请求 request.end();
关键修复点说明
- 颜色输出修正:如果要用彩色日志,必须先引入
chalk库,并且正确调用chalk.red('text'),而不是直接给字符串加.red方法。如果不需要颜色,直接用console.log('timeout')即可。 - 监听socket的error事件:
socket对象也是一个EventEmitter,它的error事件如果没被监听,一旦触发就会导致进程终止,所以必须加上这个监听。 - 确保调用request.end():很多人会忘记这一步,
https.request创建的请求必须调用end()才会发送出去,否则请求会一直挂着。
这样修改后,超时触发abort时,所有错误都会被捕获并记录,不会再导致进程终止啦!
内容的提问来源于stack exchange,提问作者baravak
相关产品推荐
相关产品推荐

