网上查了好多都没找到解决方法,求大神帮忙解决一下
发布于 10 年前 作者 dean5277 3936 次浏览 最后一次编辑是 8 年前 来自 问答

最近在学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
    });
  });

untitled1.png

保存的时候,就会报错,但是数据还是可以保存到数据库里面。 因为字段是唯一的,重复的数据是不应该保存成功的,数据库应该返回错误的信息。

求大神们帮帮忙

14 回复

用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删掉了。 前辈们我问个问题啊,多次抛出错误的话,你们一般怎么处理错误?

解决了。。。

回到顶部