【问题标题】:MongoDB connection error after 1084 inserts from NodeJS从 NodeJS 插入 1084 后 MongoDB 连接错误
【发布时间】:2020-06-13 16:10:41
【问题描述】:

我是 MongoDB 和 NodeJS 的新手。我写了一个简单的应用程序来测试 RESTFUL 状态 API 的写入速度:

const express = require('express')
const port = process.env.PORT
var MongoClient = require('mongodb').MongoClient;
const router = express.Router()

router.post('/mongo-log', async(req, res) => {
    try {
      let syserr = false;
      let e = null;
      await MongoClient.connect(process.env.MONGODB_URL,async function(err,db) {
        if(err)
        {
            console.log("-------------CONNECT ERROR----------");
            console.log(err);
            process.exit(1);
        }
        const dbo = db.db(process.env.MONGODB_NAME);
        await dbo.collection("mongolog").insertOne({details:req.body.details,createDate:(new Date())},function(err,res) {

          if(err)
          {
            console.log("-------------INSERT ERROR----------");
            console.log(err);
            process.exit(1);
          }

        });
      });
      if(e) throw e;
      res.status(201).send({"success":true})
    } catch (error) {
        console.log(error);
        res.status(400).send(error)
    }

  })

var cors = require('cors')

const app = express()

app.use(cors())
app.use(express.json())
app.use(router)

if(process.env.SSL_KEY && process.env.SSL_CRT) {
    const https = require('https')
    const fs = require('fs')
    const options = {
      key: fs.readFileSync(process.env.SSL_KEY),
      cert: fs.readFileSync(process.env.SSL_CRT)
    }

    var server = https.createServer(options, app)

    server.listen(port, () => {
      console.log("server starting on port : " + port)
    })
} else {
    app.listen(port, () => {
        console.log(`Server running on port ${port}`)
    })
}

我从终端使用npm start 启动应用程序。然后我编写了一个单独的 python 脚本,它有一个无限的 while 循环,没有任何休眠/超时,只提交 {details:{a bunch of nested objects}}request.post()

在几秒钟内一切正常。但是,当我的 API 准确地将 1084 条记录写入 mongodb 时,我从上面的一个 if 语句中得到以下错误:

----------连接错误----------

MongoNetworkError:无法连接到服务器 [127.0.0.1:27017] 首先连接[错误:写EPIPE 在 afterWriteDispatched (internal/stream_base_commons.js:150:25) 在 writeGeneric (internal/stream_base_commons.js:141:3) 在 Socket._writeGeneric (net.js:776:11) 在 Socket._write (net.js:788:8) 在 doWrite (_stream_writable.js:453:12) 在 writeOrBuffer (_stream_writable.js:435:5) 在 Socket.Writable.write (_stream_writable.js:315:11) 在 Connection.write (/home/john/projects/dbperformance/node_modules/mongodb/lib/core/connection/connection.js:271:21) 在 runCommand (/home/john/projects/dbperformance/node_modules/mongodb/lib/core/connection/connect.js:384:8) 在 performInitialHandshake (/home/john/projects/dbperformance/node_modules/mongodb/lib/core/connection/connect.js:122:3) {名称:'MongoNetworkError',[符号(mongoErrorContextSymbol)]:{} }] 在游泳池。 (/home/john/projects/dbperformance/node_modules/mongodb/lib/core/topologies/server.js:438:11) 在 Pool.emit (events.js:210:5) 在/home/john/projects/dbperformance/node_modules/mongodb/lib/core/connection/pool.js:561:14 在/home/john/projects/dbperformance/node_modules/mongodb/lib/core/connection/pool.js:994:11 在回调(/home/john/projects/dbperformance/node_modules/mongodb/lib/core/connection/connect.js:97:5) 在/home/john/projects/dbperformance/node_modules/mongodb/lib/core/connection/connect.js:124:7 在 _callback (/home/john/projects/dbperformance/node_modules/mongodb/lib/core/connection/connect.js:349:5) 在 Connection.errorHandler (/home/john/projects/dbperformance/node_modules/mongodb/lib/core/connection/connect.js:365:5) 在 Object.onceWrapper (events.js:300:26) 在 Connection.emit (events.js:210:5) { name: 'MongoNetworkError', [Symbol(mongoErrorContextSymbol)]: {}

为什么我在每 1084 条记录后不断收到错误消息?

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    您不应该在每个请求上都创建到 MongoDB 的新“连接”。尝试将连接代码移到请求处理程序之外。

    await MongoClient.connect(process.env.MONGODB_URL,async function(err,db) {
    router.post('/mongo-log', async(req, res) => {
         if(err)
            {
                console.log("-------------CONNECT ERROR----------");
                console.log(err);
                process.exit(1);
            }
            const dbo = db.db(process.env.MONGODB_NAME);
    
        try {
          let syserr = false;
          let e = null;
            await dbo.collection("mongolog").insertOne({details:req.body.details,createDate:(new Date())},function(err,res) {
    
              if(err)
              {
                console.log("-------------INSERT ERROR----------");
                console.log(err);
                process.exit(1);
              }
    
            });
          });
          if(e) throw e;
          res.status(201).send({"success":true})
        } catch (error) {
            console.log(error);
            res.status(400).send(error)
        }
    
      })
    
    
    

    【讨论】:

    • 那行得通。如果我在完成查询后关闭连接,它也可以工作。那么是让一个数据库连接保持活动状态更好,还是在每个 http 请求时打开和关闭更好?
    • @John 我认为这个答案会回答你的问题:stackoverflow.com/q/10656574/996081
    猜你喜欢
    • 1970-01-01
    • 2015-05-31
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    相关资源
    最近更新 更多