Node.js中Socket调用setTimeout报ERR_INVALID_CALLBACK问题排查
问题分析与解决方案
这个报错的原因其实非常明确,咱们一步步拆解来看:
1. 错误的直接根源
你调用req.connection.setTimeout(60 * 1000, null)时传入的第二个参数null不符合当前Node.js版本的API要求。从报错信息TypeError [ERR_INVALID_CALLBACK]: Callback must be a function. Received null就能看出来:现在的Node.js要求setTimeout的回调参数必须是一个函数,不能是null。
2. 为什么之前调用成功?
这是因为你之前使用的是较低版本的Node.js——早期的Node.js对这个API的参数校验比较宽松,允许传入null或者直接省略回调参数。但Node.js在后续版本更新中收紧了参数规则,强制要求回调必须是函数类型,所以当你升级Node.js版本后,原来的写法就触发了这个错误。
3. 修复方案(两种可选)
- 方案一:传入空函数作为回调
如果你不需要在超时触发时执行任何逻辑,直接传一个空的箭头函数就行:req.connection.setTimeout(60 * 1000, () => {}); - 方案二:直接省略回调参数
实际上setTimeout的第二个回调参数是可选的,你完全可以只传超时时间,这样既达到设置60秒超时的目的,又不会触发参数错误:req.connection.setTimeout(60 * 1000);
这样修改后,你的代码应该就能正常运行啦~以后遇到这类API参数报错,记得优先对应当前Node.js版本的官方文档确认参数要求哦!
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

