javascript - TypeError: Cannot read property 'comments' of undefined

查看:168
本文介绍了javascript - 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
                 });
              });
        });  };

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

解决方案

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

这篇关于javascript - TypeError: Cannot read property 'comments' of undefined的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆