Nodejs 向mongoDB中循环插入信息,但是每次运行数百条之后报错 TypeError: undefined is not a function

Nodejs 向mongoDB中循环插入信息,但是每次运行数百条之后报错 TypeError: undefined is not a function

定位到的错误代码是第100行: mongodb.close(); 错误信息如下:/home/nodejs/proMonitor/node_modules/mongodb/lib/mongodb/connection/base.js:245 throw message; ^ TypeError: undefined is not a function at /home/nodejs/proMonitor/node_modules/mongodb/lib/mongodb/db.js:1436:28 at /home/nodejs/proMonitor/node_modules/mongodb/lib/mongodb/db.js:1558:28 at /home/nodejs/proMonitor/node_modules/mongodb/lib/mongodb/cursor.js:160:22 at commandHandler (/home/nodejs/proMonitor/node_modules/mongodb/lib/mongodb/cursor.js:682:48) at /home/nodejs/proMonitor/node_modules/mongodb/lib/mongodb/db.js:1847:9 at Server.Base._callHandler (/home/nodejs/proMonitor/node_modules/mongodb/lib/mongodb/connection/base.js:445:41) at Server.Base._flushAllCallHandlers (/home/nodejs/proMonitor/node_modules/mongodb/lib/mongodb/connection/base.js:416:10) at Server.close (/home/nodejs/proMonitor/node_modules/mongodb/lib/mongodb/connection/server.js:188:10) at Db.close (/home/nodejs/proMonitor/node_modules/mongodb/lib/mongodb/db.js:357:21) at /home/nodejs/proMonitor/thrift/database/nodeinfo.js:100:17 nodeinfo.js中函数代码如下: 74 NodeInfo.prototype.update = function update(callback) { 75 //构建Node对象 76 var newNode = { 77 number : this.number, 78 state : this.state, 79 phone : this.phone, 80 address : this.address, 81 devAddr : this.devAddr, 82 other : this.other, 83 }; 84 mongodb.open(function(err, db) { 85 if(err) { 86 return callback(err); 87 } 88 //读取nodes集合 89 db.collection(‘nodeinfo’, function(err, collection) { 90 if(err) { 91 mongodb.close(); 92 return callback(err); 93 } 94 var query = {}; 95 query.number = newNode.number; 96 //为number属性添加索引 97 collection.ensureIndex(‘number’, {unique: true}); 98 collection.update(query, newNode,{upsert: true, multi: false, w: 1}, 99 function(err, node) { 100 mongodb.close(); 101 } 102 // console.log(‘databasr update return:’, node); 103 callback(err, node); 104 }); 105 }); 106 }); 107 }; 请问错误的原因是什么?该如何解决


5 回复

根据你提供的错误信息和代码片段,问题出在第100行 mongodb.close();。错误提示 TypeError: undefined is not a function 表明 mongodb.close() 并不是一个有效的函数调用。

错误原因

在你的代码中,mongodb.open()db.close() 的使用方式不正确。mongodb 库本身并没有 close 方法,而是通过操作数据库连接实例 db 来关闭连接。此外,你的代码在错误处理逻辑中直接调用了 mongodb.close(),这可能会导致资源管理上的问题。

解决方案

正确的做法是在完成所有数据库操作后,确保关闭数据库连接。你可以将 mongodb.close() 改为 db.close(),并确保只有在没有错误的情况下才关闭连接。

以下是修正后的代码示例:

NodeInfo.prototype.update = function update(callback) {
  // 构建Node对象
  var newNode = {
    number: this.number,
    state: this.state,
    phone: this.phone,
    address: this.address,
    devAddr: this.devAddr,
    other: this.other,
  };

  mongodb.open(function (err, db) {
    if (err) {
      return callback(err);
    }

    // 读取nodes集合
    db.collection('nodeinfo', function (err, collection) {
      if (err) {
        db.close();
        return callback(err);
      }

      var query = {};
      query.number = newNode.number;

      // 为number属性添加索引
      collection.createIndex('number', { unique: true }, function (err) {
        if (err) {
          db.close();
          return callback(err);
        }

        collection.update(
          query,
          newNode,
          { upsert: true, multi: false, w: 1 },
          function (err, node) {
            if (err) {
              db.close();
              return callback(err);
            }

            // 关闭数据库连接
            db.close();

            // 回调函数返回结果
            callback(err, node);
          }
        );
      });
    });
  });
};

关键点解释

  1. mongodb.open(): 打开数据库连接。
  2. db.collection('nodeinfo'): 获取 nodeinfo 集合。
  3. collection.createIndex(): 创建唯一索引。
  4. collection.update(): 更新或插入文档。
  5. db.close(): 在所有操作完成后关闭数据库连接。

通过这种方式,可以确保每次数据库操作完成后正确地关闭连接,避免因未关闭连接而导致的资源泄漏问题。


定位到的错误代码是第100行: mongodb.close(); 在 100 行之间加 console.log(‘Error:’, err, node); 看看出错信息。

显示的信息一直是 Error: null 1,没有出现任何异常。

包括出错的时候,在堆栈信息之前也是:Error: null 1

根据你提供的错误信息和代码片段,问题出现在 mongodb.close() 调用上。从错误信息来看,mongodb.close() 是未定义的函数。这通常是由于使用了过时的 MongoDB 驱动版本或代码中的某些部分不兼容。

错误原因

错误原因是 mongodb.close() 方法已不再被支持。在较新的 MongoDB Node.js 驱动版本中,应该使用连接池管理数据库连接,而不是手动关闭连接。

解决方案

你可以使用 db.close() 方法来关闭特定数据库的连接。以下是修改后的代码:

NodeInfo.prototype.update = function update(callback) {
  var newNode = {
    number: this.number,
    state: this.state,
    phone: this.phone,
    address: this.address,
    devAddr: this.devAddr,
    other: this.other,
  };

  mongodb.open(function(err, db) {
    if (err) {
      return callback(err);
    }

    db.collection('nodeinfo', function(err, collection) {
      if (err) {
        return callback(err);
      }

      collection.ensureIndex('number', { unique: true });

      collection.update(
        { number: newNode.number },
        newNode,
        { upsert: true, multi: false, w: 1 },
        function(err, node) {
          db.close(); // 修改这里,使用 db.close()
          callback(err, node);
        }
      );
    });
  });
};

解释

  • db.close(): 这个方法用于关闭与特定数据库的连接。
  • mongodb.open(): 在旧版驱动中,mongodb.open() 可能会返回一个全局连接,但在新版本中不推荐使用这种方式。建议每次都创建一个新的数据库连接。

通过上述修改,你应该可以避免 TypeError: undefined is not a function 的错误,并且正确地关闭数据库连接。如果仍然遇到问题,请确保你使用的 MongoDB Node.js 驱动是最新的版本。

回到顶部