关于如何处理node.js服务连接MongoDB,查阅了很多中英文资料,发现没有非常适合我预期能力的方案,所以经过一些官方文档的研究,我总结了以下连接MongoDB的方法(使用Node.js平台上最常用的MongoDBODMmongoose),并大胆称之为“最佳实践”。事不宜迟,让我们从代码开始:constmongoose=require('mongoose')constconfig=require('./config')if(process.env.NODE_ENV==='development'){mongoose.set('debug',true)/*A*/}mongoose.set('bufferCommands',false)/*B*/functionconnectMongoDB(address){try{mongoose.connect(address,{useNewUrlParser:true,bufferMaxEntries:0/*B*/autoReconnect:true/*C,默认为true,可以忽略*/poolSize:5/*D,默认为5,可以忽略*/})constdb=mongoose.connectiondb.on('error',(error)=>{console.log(`MongoDB连接失败:${error}`)})db.once('open',()=>{console.log('MongoDB连接成功')})returndb}catch(error){console.log(`MongoDBconnectingfailed:${error}`)}}constmongoInstance=connectMongoDB(config.database.mongo)module.exports={mongoInstance}这组连接方法可以满足以下需求,当然这也是从我的服务需要满足的需求中总结出来的:开发环境可以打印详细的数据库操作信息和数据库连接断开后,所有与数据库读写操作相关的命令都会立即返回错误,而不会等待重新连接而导致接口超时。自动尝试重连,直到连接成功无需手动处理连接数下面我们一一看下每个需求对应的配置:1.见注A,在开发环境中将'debug'设置为true,数据库将收集方法和参数打印到控制台2。见两个注释B,这里是mongoose文档中对bufferMaxEntries的解释:bufferMaxEntries-MongoDB驱动程序也有自己的缓冲机制,当驱动程序断开连接时启动。如果您希望数据库操作在驱动程序未连接时立即失败,而不是等待重新连接,请将此选项设置为0并将模式上的bufferCommands设置为false。核心意思是设置bufferMaxEntries为0,bufferCommands为false,使驱动不连接数据库,操作立即返回失败,而不是等待重连。在我看来,这种方法比等待数据库重新连接直到响应超时要好。3.看注释C,其实是mongoose的默认设置。连接到数据库时,配置参数autoReconnect默认为true。其含义参见文档:autoReconnect——MongoDB底层驱动在与MongoDB失去连接时会自动尝试重连。除非您是想要管理自己的连接池的极其高级的用户,否则不要将此选项设置为false。如果您不是高级用户,请不要更改此参数。4.见注D。对于MongoDB连接池的问题,建议不要手动处理。mongoose本身维护了一个连接池,默认最大数量为5。只有当你发现一些慢查询可能会阻塞快速查询时,你才应该考虑增加poolSize。当然,这个数字不能设置太大。默认情况下,MongoDB为每个连接启动一个线程。如果连接太多,系统开销会很大。当然,上面的这组“最佳实践”还有一个缺点:如果服务在初次启动后连接数据库失败(比如此时数据库宕机),服务将不会尝试连接重新连接到数据库。解决办法也不是没有,但是比较鸡肋:在mongoose连接的'error'事件监听回调函数中尝试重连。但是需要设置最大重试次数,否则会出现内存泄漏。比较的原因是,如果第一次连接不成功,短时间内尝试重连几次似乎也无济于事。所以在使用这套连接方式的时候,一定要注意数据库保持在可连接状态。或者读者有更好的解决办法,希望不吝赐教。超过。
