最近在学NODEJS 和MONGODB的时候,做了一个小项目出了点问题
在循环中插入数据,然后报错
代码:
//打开数据库
mongodb.open(function (err, db) {
if (err) {
return callback(err);
}
//读取 posts 集合
db.collection('posts', function (err, collection) {
if (err) {
mongodb.close();
return callback(err);
}
//将文档插入 posts 集合
for(var i = 0; i < post.day.length; i++ ){
var newPost ={
day : post.day[i],
lunch: post.lunch,
dinner: post.dinner,
realname : post.realname,
name : post.name,
addDate : post.addDate
}
collection.insert(newPost, {
safe: true
}, function (err) {
console.log('Error:', err) //这里报错,connection close by application
mongodb.close();
});
}
mongodb.close();
// callback(null, post);//返回 err 为 null
});
});
保存的时候,就会报错,但是数据还是可以保存到数据库里面。 因为字段是唯一的,重复的数据是不应该保存成功的,数据库应该返回错误的信息。
求大神们帮帮忙
用mongoose或者mongoskin
safe: false的时候就不会报这个错误, 但字段唯一的话,应该是会报错的啊
写到一半突然全部改换mongoose的话,工作量挺大的。
发觉了个BUG,经常会漏掉数据。
我不是大神,默默的说一句,那个insert的callback,插入一个就mongodb.close(),是不是需要判断是不是有err啊,如果有的话再mongodb.close()
这段是我乱改后放上来的。。 之前我是
if(err){ console.log(err); mongodb.close(); }
T. T 没有解决办法,我只能改mongoose去了。不如果如果有方法就回帖一下,我把代码注释,改成mongoose 去了
问题很明显,插入数据库是个异步,只有你数据都插入了才能写close(); 我同时十分不赞同一楼,遇到问题不去解决而选择逃避!!
我是尝试过把close删掉放后面,但这样问题就来了,循环中怎么返回错误信息,如果有多个插入中有一些错误,routes里不就会重复收到很多错误?是不是在循环里不能 回调?
我的目的是想在循环里,如果有错误就抛出错误,结束保存。
mongodb 自身实现了一个默认5个连接的连接池,打开之后直接用那个对象,每次都重复开关没必要
js单进程啊,采用单连接就行了,没有必要一直连接开关。建议用mongoose重构
嗯,我现在是把多余的close删掉了。 前辈们我问个问题啊,多次抛出错误的话,你们一般怎么处理错误?
解决了。。。