鍍金池/ 問(wèn)答/數(shù)據(jù)庫(kù)  HTML/ node express中的一個(gè)問(wèn)題

node express中的一個(gè)問(wèn)題

app.get('/api/mes/get',function(req,res){
    const wa = req.session.wa 
    if(!req.session.name){
        res.json({code:100})//么登錄
        return;
    }else{
        db.limModel.findOne({name:req.session.name},(err,doc)=>{
            //更新限制次數(shù)
            var key = doc.getnum;
            key++;
            if(!err){
                if(key<10){
                    db.limModel.update({name:req.session.name},{getnum:key},(e,d)=>{
                        if(!e){
                            db.mesModel.find().count(function(err,num){
                                var maxnum = num 
                                if(!err){
                                    function ya(){
                                        var randnum = Math.round(maxnum*Math.random());
                                        if(wa.indexOf(randnum) == -1){
                                            wa.push(randnum)
                                            console.log(randnum)
                                            return randnum
                                        }else{
                                            return ya();
                                        }
                                    }
                                    ya()
                                    console.log(req.session.wa)
                                    db.mesModel.find().skip(ya()).limit(1).exec(function(err,doc){
                                        const d1 = doc;
                                        db.userDetailsModel.findOne({name:req.session.name},(e,d)=>{
                                            if(!e){
                                                res.json({d1,d})
                                            }
                                        });
                                    })
                                }
                            })
                        }else{
                            console.log(e)
                        }
                    });
                }else{
                    res.json({code:200})//每天10次
                }
            }else{
                console.log(err)
            }
        })
    }
})

問(wèn)題出現(xiàn)在打印的那個(gè)console.log(randnum)和console.log(req.session.wa)中,已經(jīng)設(shè)置了req.session.wa為一個(gè)空的數(shù)組

目的是,通過(guò)mongo的skip來(lái)達(dá)到隨機(jī)取數(shù)據(jù),skip的值為隨機(jī)數(shù),為了讓不取到重復(fù)的值,就把已經(jīng)取過(guò)了的skip的值放進(jìn)session里,但是測(cè)試的時(shí)候發(fā)現(xiàn)不對(duì)
圖片描述

從第一次取隨機(jī)數(shù)之后,后面的都進(jìn)行了兩兩次隨機(jī)數(shù)取值,然后單獨(dú)把skip那一段打印

db.limModel.findOne({name:'ba'},(err,doc)=>{
            var wa = new Array()
            var key = doc.getnum;
            key++;
            if(!err){
                if(key<10){
                    db.limModel.update({name:'ba'},{getnum:key},(e,d)=>{
                        if(!e){
                            db.mesModel.find().count(function(err,num){
                                var maxnum = num 
                                if(!err){
                                    function ya(){
                                        var randnum = Math.round(maxnum*Math.random());
                                        console.log(randnum)
                                        if(wa.indexOf(randnum) == -1){
                                            wa.push(randnum)
                                            console.log(randnum)
                                            return 
                                        }else{
                                            return ya();
                                        }
                                    }
                                    ya();
                                    db.mesModel.find().skip(ya()).limit(1).exec(function(err,doc){
                                    })
                                }
                            })
                        }else{
                            console.log(e)
                        }
                    });
                }else{
                    res.json({code:200})//每天10次
                }
            }else{
                console.log(err)
            }
        })

圖片描述

居然是這樣的,為什么會(huì)出現(xiàn)這樣的事啊,求大神講一下啊

回答
編輯回答
何蘇葉
app.get('/api/mes/get',function(req,res){
    const wa = req.session.wa 
    if(!req.session.name){
        res.json({code:100})//么登錄
        return;
    }else{
        // 根據(jù)session中的name來(lái)查詢數(shù)據(jù)
        db.limModel.findOne({name:req.session.name},(err,doc)=>{
            //更新限制次數(shù)
            var key = doc.getnum;
            // key++
            key++;
            if(!err){
                if(key<10){
                    // 根據(jù)session中的name來(lái)更新 getnum
                    db.limModel.update({name:req.session.name},{getnum:key},(e,d)=>{
                        if(!e){
                            //更新完成后,統(tǒng)計(jì)mesModel中條目數(shù)量
                            db.mesModel.find().count(function(err,num){
                                // 得到mesModel中的條目數(shù)量
                                var maxnum = num 
                                if(!err){
                                    // 隨機(jī)數(shù)生成方法
                                    function ya(){
                                        var randnum = Math.round(maxnum*Math.random());
                                        // 判斷 session中的wa值 是否和randnum相等
                                        if(wa.indexOf(randnum) == -1){
                                            // 如果相等,添加值到wa數(shù)組中
                                            wa.push(randnum)
                                            console.log(randnum)
                                            return randnum
                                        }else{
                                            return ya();
                                        }
                                    }
                                    // 立即執(zhí)行,應(yīng)該得到一個(gè)隨機(jī)數(shù)的值
                                    ya() // 第一次執(zhí)行
                                    // 輸出最新的數(shù)組
                                    console.log(req.session.wa)
                                    // mesModel 中獲取數(shù)據(jù),并且跳過(guò)ya();  這里已經(jīng)代碼有問(wèn)題,上面執(zhí)行過(guò)一次,這里又創(chuàng)建一個(gè)隨機(jī)數(shù)值。
                                    db.mesModel.find().skip(ya()/*第二次執(zhí)行*/).limit(1).exec(function(err,doc){
                                        const d1 = doc;
                                        db.userDetailsModel.findOne({name:req.session.name},(e,d)=>{
                                            if(!e){
                                                res.json({d1,d})
                                            }
                                        });
                                    })
                                }
                            })
                        }else{
                            console.log(e)
                        }
                    });
                }else{
                    res.json({code:200})//每天10次
                }
            }else{
                console.log(err)
            }
        })
    }
})
2018年2月26日 02:28