关于 express 中使用 mongodb 第二次失败问题
- 问题描述
最近在学习使用 express 和 mongodb;
做了demo例子,发现个问题,就是每次从页面上发送请求往表里添加数据时,第一次正常,第二次就报错了?
- 对应代码
- express 版本 4.16.4
- mongodb 版本 3.1.10
// express
const express = require('express')
const bodyParser = require('body-parser')
const app = express()
// mongodb
const urlDB = 'mongodb://localhost:27017'
const MongoClient = require('mongodb').MongoClient
const Client = new MongoClient(urlDB, { useNewUrlParser: true })
// mongodb function
const insertDoc = function(db, collectionName, data, callback) {
const collection = db.collection(collectionName)
collection.insertOne(data, (err, res) => {
callback && callback(err, res)
})
}
app.use(bodyParser.urlencoded({ extended: true }))
// 使用虚拟目录的静态服务
app.use('/static', express.static('public'))
// 路由
app.get('/', (req, res) => {
res.sendFile(__dirname + '/index.html')
})
// 应用
app.post('/insert', (req, res) => {
// mongodb
Client.connect((err) => {
const db_ = Client.db('user')
console.log('-连接成功-', err);
insertDoc(db_, 'user', req.body, (errDB, resDB) => {
if (errDB) {
console.log('-插入失败-', errDB);
res.send({succ: false})
} else {
resDB.result.ok && res.send({succ: true})
Client.close()
}
})
})
})
// 端口号
app.listen(3000)
- 错误代码
the options [servers] is not supported
the options [caseTranslate] is not supported
-连接成功- null
-插入失败- { MongoError: server instance pool was destroyed
at basicWriteValidations (/Users/chisecj/Documents/project/study/test_node/09_express/node_modules/_mongodb-core@3.1.9@mongodb-core/lib/topologies/server.js:700:41)
at Server.insert (/Users/chisecj/Documents/project/study/test_node/09_express/node_modules/_mongodb-core@3.1.9@mongodb-core/lib/topologies/server.js:805:16)
at Server.insert (/Users/chisecj/Documents/project/study/test_node/09_express/node_modules/_mongodb@3.1.10@mongodb/lib/topologies/topology_base.js:321:25)
at insertDocuments (/Users/chisecj/Documents/project/study/test_node/09_express/node_modules/_mongodb@3.1.10@mongodb/lib/operations/collection_ops.js:838:19)
at insertOne (/Users/chisecj/Documents/project/study/test_node/09_express/node_modules/_mongodb@3.1.10@mongodb/lib/operations/collection_ops.js:868:3)
at executeOperation (/Users/chisecj/Documents/project/study/test_node/09_express/node_modules/_mongodb@3.1.10@mongodb/lib/utils.js:420:24)
at Collection.insertOne (/Users/chisecj/Documents/project/study/test_node/09_express/node_modules/_mongodb@3.1.10@mongodb/lib/collection.js:464:10)
at insertDoc (/Users/chisecj/Documents/project/study/test_node/09_express/app.js:12:14)
at Client.connect (/Users/chisecj/Documents/project/study/test_node/09_express/app.js:30:5)
at result (/Users/chisecj/Documents/project/study/test_node/09_express/node_modules/_mongodb@3.1.10@mongodb/lib/utils.js:414:17) name: 'MongoError', [Symbol(mongoErrorContextSymbol)]: {} }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
Client.close()
你都把client关闭了,第二次来当然要报错了。去掉就好。
MongoClient
对象应该在整个生命周期内保持单例,退出应用前都不要关闭,也不应该关闭,因为它还维护着连接池,一旦关闭下次再开需要重建连接,非常浪费资源和降低效率。所以你下面那种写法也是不对的。重新看了遍文档,理了理逻辑,发现是自己的用法和理解出错了!