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 }; 请问错误的原因是什么?该如何解决
根据你提供的错误信息和代码片段,问题出在第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);
}
);
});
});
});
};
关键点解释
mongodb.open()
: 打开数据库连接。db.collection('nodeinfo')
: 获取nodeinfo
集合。collection.createIndex()
: 创建唯一索引。collection.update()
: 更新或插入文档。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 驱动是最新的版本。