Node查询mongo时双重回调读取报错

router.js中

//显示某一个用户的个人主页
exports.showUser = function(req,res,next){
    var user = req.params["user"];
    db.find("posts",{"username":user},function(err,result){
        db.find("users",{"username":user},function(err,result2){
            console.log(result2);
            res.render("user",{
                "login": req.session.login == "1" ? true : false,
                "username": req.session.login == "1" ? req.session.username : "",
                "user" : user,
                "active" : "我的说说",
                "cirenshuoshuo" : result,
                "cirentouxiang" : result2[0].avatar
            });
        });
    });

}

我这里console.log(result)打印出了信息啊,

clipboard.png

下面定位到的代码
router.js:330:45 就是上面那个代码
db.js:94:17 :

exports.find = function (collectionName,json,C,D) {
    var result = [];   //结果数组
    //JS没有函数重载,只能手动实现
    if(arguments.length == 3) {
       //如果没有传args
        //那么参数C就是callback,参数D没有传。
        var callback = C;
        var skipnumber = 0;
        //数目限制,limit(0)就是没有限制
        var limit = 0;
    }else if(arguments.length == 4) {
        var args = C;
        var callback = D;
        //应该省略的条数
        var skipnumber = args.pageamount * args.page || 0;
        //数目限制
        var limit = args.pageamount || 0;
        //排序方式
        var sort = args.sort || {};
    }else {
        throw new Error("find函数的参数个数,必须是3个,或者4个");
        return;
    }
    //从第零页开始
    // console.log("略过了"+skipnumber+"条"+"限制在"+limit+"条");
    //链接数据库,链接之后查找所有
    _connectDB(function (err,db) {
        var cursor = db.collection(collectionName).find(json).skip(skipnumber).limit(limit).sort(sort);
        cursor.each(function (err, doc) {
            if(err) {
                callback(err,null);
                db.close();
                return;
            }
           if(doc != null) {
               result.push(doc); //放入结果数组
           }else {
               //遍历结束,没有更多的文档
                callback(null,result);
               db.close();//关闭数据库
           }
        });
    });
}

clipboard.png

不能帮忙的进来给点提示,解决Bug技巧也行啊。

阅读 2.5k
2 个回答

看这个报错信息应该是你的result2[0]是undefined,那么很有可能是你在user这个db里没有找到符合条件的result2
具体你可以先吧render里的cirentouxiang字段去掉,打印下result2,这样应该可以定位出问题所在
我又看了下你的打印信息,仔细看,你的报错的上面是一个空数组[],所以肯定会报错的

async和await传一个隐性Promise可以解决双重回调问题

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题