Express向MongoDB插入数据时报MongoNotConnectedError如何解决?
问题原因
你在client.connect的回调函数末尾直接执行了client.close()语句,Mongo连接会在回调执行完成后立刻被关闭。你注册的/addProduct接口是异步触发的,只有实际收到请求时才会运行插入逻辑,此时连接早已关闭,因此抛出未连接报错。
解决方法
方案1(推荐,适配常规Web服务场景)
直接删除client.connect回调末尾的client.close()语句即可。
Web服务运行期间需要持续和数据库交互,不需要手动关闭全局连接,MongoDB会自动维护连接池的资源占用,该方案性能更高。
修改后对应的代码片段参考:
client.connect((err) => { if(err) { // 建议补充连接失败的错误处理逻辑 console.error('数据库连接失败:', err) return } const productsCollection = client .db(process.env.DB_NAME) .collection(process.env.DB_COLLECTION); console.log("database connected") app.post("/addProduct", (req, res) => { const products = req.body; productsCollection.insertMany(products).then((result) => { console.log(result.insertedCount); res.send(result.insertedCount.toString()); }).catch(err => { // 补充接口错误处理 console.error('插入数据失败:', err) res.status(500).send('数据插入失败') }); }); });
方案2(适配需要按需关闭连接的特殊场景)
如果你的业务场景不适合保持长连接,可以改成每次处理接口请求时临时建立连接,操作完成后再关闭连接,示例代码如下:
app.post("/addProduct", async (req, res) => { const products = req.body; let client; try { client = await MongoClient.connect(uri, { useNewUrlParser: true, useUnifiedTopology: true, }); const productsCollection = client .db(process.env.DB_NAME) .collection(process.env.DB_COLLECTION); const result = await productsCollection.insertMany(products); console.log(result.insertedCount); res.send(result.insertedCount.toString()); } catch (err) { console.error('操作失败:', err); res.status(500).send('数据插入失败'); } finally { if (client) { await client.close(); } } });
补充说明
如果你的MongoDB Node.js驱动版本为4.0及以上,useNewUrlParser和useUnifiedTopology两个配置项已经默认开启,可以直接省略不写。
内容的提问来源于stack exchange,提问作者Md. Shoaib Akhter Shifat
相关产品推荐
相关产品推荐

