MongoDB Node驱动connect()忽略超时参数connectTimeoutMS问题
根因说明
MongoDB Node.js Driver 4.x 版本对连接配置的结构做了不兼容调整,你当前把connectTimeoutMS、socketTimeoutMS直接写在connect方法的顶层配置对象里的写法,驱动不会识别这两个参数,会直接 fallback 到默认的30000ms超时配置,所以你设置的2s超时不生效。
4.x版本中,这两个Socket层级的超时参数,必须放在socketOptions子配置对象下才会被加载。
正确配置示例
var url = "<my mongodb:// URI>"; var client = require('mongodb').MongoClient; client.connect( url, { socketOptions: { connectTimeoutMS: 2000, socketTimeoutMS: 2000 } }, <callback function> );
补充说明
- 如果你习惯直接在MongoDB连接串里传参,可以直接在URI后拼接参数:
<my mongodb:// URI>?connectTimeoutMS=2000&socketTimeoutMS=2000,这种写法不需要额外在options里配置,驱动可以正确解析 - 注意区分超时场景:如果是地址写错、服务未启动、副本集无可用节点这类场景,驱动先走服务器选择逻辑,对应的超时配置是顶层的
serverSelectionTimeoutMS,这个参数默认值同样是30000ms,如果你需要控制这类场景的超时时间,直接在顶层配置该参数即可,不需要放到socketOptions下 - 配置修改后可以用防火墙拦截端口、停掉MongoDB服务的方式做验证,超时会在你设置的2s阈值左右触发,不会再等待默认的30s
内容的提问来源于stack exchange,提问作者fgalan
相关产品推荐
相关产品推荐

