Node.js报错:TypeError: 无法读取undefined的'close'属性求解答
解决Node.js中unhandledRejection回调里server.close()的TypeError问题
错误原因
你在unhandledRejection回调内用let server重新声明了一个局部变量,这个变量没有被赋值,默认是undefined,调用.close()自然会抛出"Cannot read properties of undefined (reading 'close')"错误。
真正的服务器实例是你启动HTTP/HTTPS服务时返回的对象(比如const server = app.listen(3000)),但你在回调里没有引用这个全局/上层作用域的实例,反而新建了一个空变量。
解决方案
1. 让server实例在回调作用域内可访问
把启动服务器时的实例变量放在全局或回调能访问的上层作用域:
// 模块级作用域声明server let server; // 启动服务器时赋值 server = app.listen(3000, () => { console.log('Server running on port 3000'); }); process.on('unhandledRejection', (err, promise) => { console.log(`Error: ${err.message}`.red); // 直接使用上层作用域的server实例 if (server) { server.close(() => process.exit(1)); } else { // 服务器未启动时直接退出 process.exit(1); } });
2. 增加容错处理
添加if (server)判断,避免服务器还未初始化完成就触发unhandledRejection的情况,防止二次报错。
3. 可选:处理close卡住的情况
如果server.close()因未处理连接等原因卡住,可设置超时强制退出:
process.on('unhandledRejection', (err, promise) => { console.log(`Error: ${err.message}`.red); if (server) { server.close(() => process.exit(1)); // 5秒后强制退出 setTimeout(() => process.exit(1), 5000); } else { process.exit(1); } });
内容的提问来源于stack exchange,提问作者benjamin ontiveros
相关产品推荐
相关产品推荐

