问题描述
我目前有一个控制器正在处理用户的入职情况。当用户完成其入职流程时,我将其在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 (将#修改为@)