猫鼬更新未在我的Res.Send之前运行

问题描述

我目前有一个控制器正在处理用户的入职情况。当用户完成其入职流程时,我将其在Mongo中的状态从New更新为Active,然后将其发送到新页面。作为一种安全方法,我在每条经过身份验证的路由上都具有中间件功能,该功能可检查用户是否已登录及其状态。如果它们的状态为New,我会将它们发送到入职流程(因为从理论上讲他们没有看到入职流程)。

根据我的经验,当我提交入职流程时,我会被重定向回到流程的开始。我检查了Mongo,但我的身份不再是New,所以我很困惑为什么会这样。最终,我意识到,当我将用户发送到新页面时,身份验证路由会在findOneAndUpdate()有机会完成之前检查用户的状态。因此,由于上一次查询未及时完成,因此用户重定向回了入职流程。

有人知道如何解决此问题吗?我认为这与异步/等待有关,但我不确定。这是下面的代码,我正在使用Express框架在Node.JS中工作。另外,在入职时,我正在使用mapBox api获取其邮政编码的纬度/经度,这就是为什么在代码中包含request.get()的原因。

入职控制器

exports.postOnboarding = (req,res,next) => {              

var data = req.params.data;    
var final = data.split(',');       

location = final[4].toString();
url = "https://api.mapBox.com/geocoding/v5/mapBox.places/" + location + ".json";
    
request.get(url)
.query({access_token: "private_key"})
.end(function(err,result) {                    

    User.findOneAndUpdate(
        {"credentials.userId": req.session.user.credentials.userId },{ practiceSettings: {
            businessType: final[2],experienceType: final[0],fullFee: final[3]
        },credentials: {
            userType: "Active",active: true,userId: req.session.user.credentials.userId,provider: "local"
        },paySettings: {
            q1: "undeternmined"
        },license: final[1],zip: final[4],latLong: result.body.features[0].center
        },(err,result) => {
            if (err) {
                console.log(err);
            } else {                                                    
                console.log("settings updated");                    
                res.redirect('/dashboard');
            }                        
        }
    )

}) };

    

仪表板路线

router.get('/dashboard',isAuth,adminController.getDashboard);

isAuth中间件

const User = require('../models/user');

module.exports = (req,next) => {    

    if (!req.session.isLoggedIn) {
        return res.redirect('/login');
    } else if (req.session.user.credentials.userType == 'Unverified') {
        return res.redirect('/login?verified=false');
    } else if (req.url == '/onboarding') {
        return next();
    }

    User.findOne({"credentials.userId" : req.session.user.credentials.userId})
    .then(result => {                  

        res.locals.user = result;          
        if (req.session.sidebarStatus == 'closed') {
            res.locals.sidebarStatus = 'closed';
        }
                
        if (result.credentials.userType == 'New') {            
            return res.redirect('/onboarding');
        }

        next();
    })        
}

作为参考,以下是我的onboarding.ejs文件摘要,该摘要称为发布路线。这不是全部,我有很多嵌套的Sweet Alert模式,但这是重要的部分。

Swal.fire({
    text: "Question",width: "90%",input: "text",inputPlaceholder: "92805",inputValidator: (value) => {
        if (!value) {
        return 'You must fill in this field.'
        }

        if (value.length != 5) {
            return 'Please use a 5 digit zip-code as your answer.'
        }
    },showCancelButton: false,confirmButtonText: 'Submit',backdrop: '#FFFFFF',allowOutsideClick: false
    })
    .then((result5) => {
        res3 = result3.value.replace(",","");
        final = [result1.value,result2.value,res3,result4.value,result5.value];                            
        $.ajax({                            
            url: "/post-onboarding/" + final,dataType: 'json',type: 'post',success: function (data) {
                if ( data.length ) {
                    Swal.fire({
                        title: 'Error!',text: 'Something bad happened',icon: 'error',confirmButtonText: 'OK'
                    });     
                } else {
                    //redirect user                                
                }
            }                                           
});

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)