关于 express 中使用 mongodb 第二次失败问题

发布于 2022-09-11 16:55:32 字数 3039 浏览 7 评论 0

- 问题描述

最近在学习使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

淡墨 2022-09-18 16:55:32

Client.close()
你都把client关闭了,第二次来当然要报错了。去掉就好。
MongoClient对象应该在整个生命周期内保持单例,退出应用前都不要关闭,也不应该关闭,因为它还维护着连接池,一旦关闭下次再开需要重建连接,非常浪费资源和降低效率。所以你下面那种写法也是不对的。

戴着白色围巾的女孩 2022-09-18 16:55:32

重新看了遍文档,理了理逻辑,发现是自己的用法和理解出错了!

  • 按照官方实例其实应该每次连接都要创建新的实例,而不是只创建一个;
  • 就像答1说的那样我把唯一的实例关了,所以只好报错了;
  • 所以应该把 new MongoClient 移到路由内就好了;
app.post('/insert', (req, res) => {
  // mongodb
  const Client = new MongoClient(DBurl, { useNewUrlParser: true })
  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.post('/insert', (req, res) => {
  // mongodb
  MongoClient.connect(DBurl, { useNewUrlParser: true }, (err, client) => {
    // console.log('client--', client);
    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()
      }
    })
  })
})
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文