鍍金池/ 問(wèn)答/數(shù)據(jù)庫(kù)  HTML/ Node查詢(xún)mongo時(shí)雙重回調(diào)讀取報(bào)錯(cuò)

Node查詢(xún)mongo時(shí)雙重回調(diào)讀取報(bào)錯(cuò)

router.js中

//顯示某一個(gè)用戶(hù)的個(gè)人主頁(yè)
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" : "我的說(shuō)說(shuō)",
                "cirenshuoshuo" : result,
                "cirentouxiang" : result2[0].avatar
            });
        });
    });

}

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

clipboard.png

下面定位到的代碼
router.js:330:45 就是上面那個(gè)代碼
db.js:94:17 :

exports.find = function (collectionName,json,C,D) {
    var result = [];   //結(jié)果數(shù)組
    //JS沒(méi)有函數(shù)重載,只能手動(dòng)實(shí)現(xiàn)
    if(arguments.length == 3) {
       //如果沒(méi)有傳args
        //那么參數(shù)C就是callback,參數(shù)D沒(méi)有傳。
        var callback = C;
        var skipnumber = 0;
        //數(shù)目限制,limit(0)就是沒(méi)有限制
        var limit = 0;
    }else if(arguments.length == 4) {
        var args = C;
        var callback = D;
        //應(yīng)該省略的條數(shù)
        var skipnumber = args.pageamount * args.page || 0;
        //數(shù)目限制
        var limit = args.pageamount || 0;
        //排序方式
        var sort = args.sort || {};
    }else {
        throw new Error("find函數(shù)的參數(shù)個(gè)數(shù),必須是3個(gè),或者4個(gè)");
        return;
    }
    //從第零頁(yè)開(kāi)始
    // console.log("略過(guò)了"+skipnumber+"條"+"限制在"+limit+"條");
    //鏈接數(shù)據(jù)庫(kù),鏈接之后查找所有
    _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); //放入結(jié)果數(shù)組
           }else {
               //遍歷結(jié)束,沒(méi)有更多的文檔
                callback(null,result);
               db.close();//關(guān)閉數(shù)據(jù)庫(kù)
           }
        });
    });
}

clipboard.png

不能幫忙的進(jìn)來(lái)給點(diǎn)提示,解決Bug技巧也行啊。

回答
編輯回答
礙你眼

async和await傳一個(gè)隱性Promise可以解決雙重回調(diào)問(wèn)題

2017年1月25日 13:29
編輯回答
無(wú)標(biāo)題

看這個(gè)報(bào)錯(cuò)信息應(yīng)該是你的result2[0]是undefined,那么很有可能是你在user這個(gè)db里沒(méi)有找到符合條件的result2
具體你可以先吧render里的cirentouxiang字段去掉,打印下result2,這樣應(yīng)該可以定位出問(wèn)題所在
我又看了下你的打印信息,仔細(xì)看,你的報(bào)錯(cuò)的上面是一個(gè)空數(shù)組[],所以肯定會(huì)報(bào)錯(cuò)的

2018年7月3日 09:37