我最近学到Express框架,用到redirect, 视频里面有时候就说要return,有时候又不要return,遂查了一下
情况一:
User.findOne({name: name},function(err, user){
if(err) {
console.log(err);
}
if(!user) {
return res.redirect('/login_error_user_not_exists');
// 上面这句等同于下面这两行,先进行redirect,后接一个return
// res.redirect('/login_error_user_not_exists');
// return;
}
/**
* 注意上面这段代码, 如果我查询后根本就没有这个user
* 要查到了那肯定user是存在的嘛,现在是没有, user为null, !user为 true
* 所有重定向到'/login_error_user_not_exists'
* 但是注意,我们后面还有一个密码匹配的方法,如果不return的话,下面密码验证会继续进行
* 但这是没有意义的,没有这用户都,还验证密码干嘛,所以我们此刻要添加return, 来结束这个
* 路由函数,不浪费性能也不做没意义的事(验证密码正确)
*/
user.comparePassword(password, function(err, isMatch){
if(err) console.log(err);
if(isMatch) {
console.log('Password is matched');
return res.redirect('/');
}else{
console.log('Password is not matched');
}
})
})
情况二:
// login_guard.js file [middleware]
// check if the page being requested is login page
// check the state of the user whether logged in
// if the user is logged in, then pass the request
// otherwise check the role of the current user
// if it is normal, then we redirect it to home page
// if not,
function guard(req, res, next) {
if (req.url != '/login' && !req.session.username) {
res.redirect('/admin/login');
}else{
if (req.session.role == 'normal') {
res.redirect('/home');
return;
}
next(); // 这个是只有登陆后角色是admin(管理员)才可以进行的操作
}
}
module.exports.login_guard = guard;
注意:
这个函数里面,有个if-else判断,第一个if(req.url != '/login' && !req.session.username)不用管什么意思,就知道是没登陆就访问管理面板的情况下,就都让他先跳转到登陆页面,先给我登陆去再说,先让我看看你登陆后的角色是什么,是管理员(admin),还是一般的用户(normal), 给你分别呈现跳转页面。如果是这种情况呢,那我进入这个if语句之后就跳转就完事了,下面没有需要我执行的代码了,所以此刻,我return与否后面都没有什么要执行的操作了,结不结束也都结束了,因为return是为了结束后面代码的执行,我现在后面都没有要执行的代码了,结果不都一样吗现在,所以不需要return了,
现在再看那个else语句里面,我先判断你登录的角色是不是【普通用户】,是就先拦截了,给你跳转到主页,就别想着进我管理页面了,一个普通用户, 而后面那个是只有登陆后角色是【管理员】才可以执行的操作,所以我在上面的那个普通用户跳转就需要添加return操作,否则继续往下执行,就执行了next()操作,那不乱套了嘛,你一普通用户,还能干我管理员才能进行的操作,所以需要加return,阻止下面的代码执行,
感觉第二个例子举得不是很恰当,但也没找到更好的,希望大家凑活看吧,希望能帮到和我一样,对这块有点不清楚的同学。
觉得好,劳驾您点个赞呗,哈哈哈O(∩_∩)O~
参考: