【问题标题】:MongoNetworkError: connection establishment was cancelledMongoNetworkError:连接建立被取消
【发布时间】:2022-09-29 02:55:16
【问题描述】:

我正在尝试使用 Mongoose 更新数据库,但在运行节点应用程序时出现此网络错误。

const mongoose = require(\'mongoose\')
mongoose.connect(\"mongodb://localhost:27017/fruitsDB\")
const fruitsSchema = new mongoose.Schema({
    name: {
        type: String,
        required: [true, \"Why no Name?\"]
    },
    rating: {
        type: Number,
        min: 1,
        max: 10
    },
    review: String
 });
 const Fruit = mongoose.model(\"Fruit\", fruitsSchema)
Fruit.find(function(err, fruits){
    if(err){
        console.log(err)
    }
    
    
    else{
        mongoose.connection.close();
        
        fruits.forEach(function(fruit){
            console.log(fruit.name)
        })
    }
})
Fruit.updateOne({_id:\"62b6a681eb136efde7ed17bc\"}, {name: \"Banana\"}, function(err){
    if(err){
        console.log(err)
    }
    else{
        console.log(\"Successfully updated the document\")
    }
})

错误:运行节点应用程序时出现命令行错误

MongoNetworkError: connection establishment was cancelled
    at connectionFailureError 
    at CancellationToken.<anonymous> 
    at Object.onceWrapper (node:events:641:28)
    at CancellationToken.emit (node:events:527:28)
    at ConnectionPool.close 
    at Server.destroy 
    at destroyServer 
    at eachAsync

这是一个使用 Mongoose 创建的简单 Node 应用程序。

  • 类似问题已回答here

标签: javascript node.js mongodb mongoose


【解决方案1】:

上次调用 find 函数对我有用。我的意思是,像这样——

Fruit.updateOne({_id:"62b6a681eb136efde7ed17bc"}, {name: "Banana"}, function(err){
    if(err){
        console.log(err)
    }
    else{
        console.log("Successfully updated the document")
    }
})
Fruit.find(function(err, fruits){
    if(err){
        console.log(err)
    }
    
    
    else{
        mongoose.connection.close();
        
        fruits.forEach(function(fruit){
            console.log(fruit.name)
        })
    }
})

关闭连接应该在最后,这就是代码没有得到正确执行的原因。

【讨论】:

    【解决方案2】:

    我尝试最后调用 find 函数,但仍然得到同样的错误,如下所示:

    MongoNetworkError: connection establishment was cancelled
    

    我不知道当它发生在正在运行的应用程序中时如何解决这个问题,但现在如果你只想将文档插入集合中,那么只需完全注释 .find 方法,然后运行应用程序,它将成功插入然后注释 .updateOne 方法并取消注释 .find 方法,您将成功添加文档并可以获得查找结果。

    我也这样做了!

    或者

    我发现由于某种原因 .find 方法在.updateOne 之前执行,因此在更新集合之前连接已关闭。

    所以,如果我们这样做有用。

    Fruit.updateOne({_id:"62b6a681eb136efde7ed17bc"}, {name: "Banana"}, function(err) {
      if (err) {
        console.log(err)
      } else {
        Fruit.find(function(err, fruits) {
          if (err) {
            console.log(err)
          } else {
            mongoose.connection.close();
                  
            fruits.forEach(function(fruit) {
              console.log(fruit.name)
            })
          }
        });
        console.log("Successfully updated the document")
      }
    })
    

    【讨论】:

    • 连同上述解决方案调用 find 函数首先像@Ayush Parui 一样工作
    【解决方案3】:

    您无法在 find 方法中关闭连接。关闭连接后,您将无法与数据库交互。只需将mongoose.connection.close() 放在末尾即可。

    【讨论】:

      【解决方案4】:

      只是做这样的事情:

      `People.insertMany([man1, man2, man3], 
         function (err) {
           if (err) {
             console.log(err);
           } else {
             console.log("Successfully saved all 
             models in the database");
             mongoose.connection.close();
            }
       });`
      

      关闭insertmany 内部的连接对我有用

      【讨论】:

        【解决方案5】:

        在阅读了一些解决方案后,TL:DR 是:mongoose.disconnect();,这是导致问题的原因,在您更新任何内容之前连接已被终止

        【讨论】:

          猜你喜欢
          • 2019-09-08
          • 2022-07-27
          • 1970-01-01
          • 2019-04-26
          • 1970-01-01
          • 1970-01-01
          • 2021-11-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多