Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
464 views
in Technique[技术] by (71.8m points)

TypeError: Cannot read property 'comments' of undefined

数据结构为mongodb数据库,posts集合下的comments为一个数组对象,把comment是最为评论区,想在存入新评论时,先检测评论区的个数,也就是comments的length属性。 代码如下:

 


            function commentFloor (id, back) {
            //打开数据库
            mongodb.open(function (err, db) {
             if (err) {
                 return back(err);
             }
             //读取posts集合
             db.collection('posts', function (err, collection) {
                 if (err) {
                     mongodb.close();
                     return back(err);
                 }
                 //根据条件查找对应的对象
                 collection.find({"_id":ObjectId(id)}).toArray(function (err, docs) {
                     console.log(ObjectId(id));
                     mongodb.close();
                     if (err) {
                         return back(err); //失败返回err
                     }
                     console.log(typeof(docs));
                     console.log(docs);
                     back(null, docs);
                 });
             });
 
         }); }  Comment.prototype.add = function(id, callback) {
         //存储时间
         var date = new Date();
         var time = {
             minute: date.getFullYear() + "-"+ (date.getMonth() + 1) + "-" + date.getDate() +  " " + date.getHours() + ":" +
 date.getMinutes()
 + ":" + date.getSeconds()
         }
 
         //!!!!!!!!!先定义个一个floor变量,以便后面的函数对其返回值
         var commentArray = [];
         console.log(commentArray)
         //调用前面定义的查找comments数组的函数。
         var commentArray = commentFloor(id, function(err, docs) {
             if (err) {
                 commentArray = []
             }
             console.log(docs);
             return docs;
        } );
        // commentArray = docs[0].comments;             
        console.log(commentArray);
**此处的commentArray输出为undefined。不知为何**
         var floor = commentArray.comments.length;
      console.log(floor);
         //要存入数据库的文档
         var comment = {
             name: this.name,
             head: this.head,
             time: time,
             comment: this.comment,
             floor: floor
         };
     
        //打开数据库
         mongodb.open(function (err, db) {
             if (err) {
                 return callback(err);
            }
             //读取posts集合
             db.collection('posts', function(err, collection) {
                if (err) {
                    mongodb.close();
                     return callback(err);
                 }
                //根据_id为查询条件更改文章
                 collection.update({"_id":ObjectId(id)}, {
                    //comments为数组形式,可以直接用push来添加项
                     $push: {'comments': comment}
                 } , function (err) {
                     mongodb.close() ;
                     if (err) {
                         return callback(err);
                     }
                     callback(null); // err返回null
                 });
              });
        });  };

这个问题已经忙活了一天了,各种查资料,没方法,只有向大家求助了,谢谢!!!


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

var commentArray = [];
console.log(commentArray)
//这里输出肯定是空
// var commentArray = commentFloor(id, function(err, docs) {//注意:你重新声明了变量commentArray
// if (err) {
// commentArray = []
// }
// //在这个里面你想把回调的值赋给commentArray
// //docs是个数组,是因为你commentFloor回调返回的就是数组
// console.log(docs);
// return docs;
// } );
console.log(commentArray);//这里之所以undefined,是因为被注释的这一段(上面)是异步执行的,输出语句会先于你的异步回调结果出来之前输出,
//那么就是输出commentArray这个变量,这个变量你重新声明了,又没拿到赋值,所以就是undefined


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...