【问题标题】:IF Statement is setting a session attribute in NODE js and expressIF 语句在 NODE js 中设置会话属性并表示
【发布时间】:2021-01-16 04:33:36
【问题描述】:

我正在尝试为 Uni 项目创建登录页面,但在尝试根据访问级别重定向用户时遇到困难,if 语句在函数之前设置访问角色,因此在首次登录时所有流量被重定向到管理页面,刷新页面使代码正常工作,当从数据库获取详细信息的代码完成运行时......任何帮助将非常感谢!

登录控制器

const session = require('express-session');
var Login = require('../models/Login');

exports.checksLogin = (req, res) => {
    // Implement this method using the pupil model
    console.log(req.originalUrl + "POST Received with query: ", req.body)
    const {Email, Pswd} =  req.body
    Login.checkLogin(Email, Pswd)
    if(session.AccessRole='Admin'){
        res.redirect('/admin')
    }
    else{
    }
}

Login.js(模型)

exports.checkLogin = (Email, Pswd) => {
    var database = require('../dbConfig');
    database.then(con => {
        con.query("SELECT * FROM Pupils WHERE Email = '" + Email + "'AND Pswd= '" + Pswd + "'").then(([rows]) => {
            //console.log(rows)
            if(rows.length>0){
                
                session.LoggedIn=true;
                session.FirstName=rows[0].FirstName
                session.LastName=rows[0].LastName
                session.Email=rows[0].Email
                session.CourseCode=rows[0].CourseCode
                session.Pswd=rows[0].Pswd
                session.AccessRole='Student'

                console.log(session.Loggedin+ '1')


            }
            else {
                con.query("SELECT * FROM Staff WHERE Email = '" + Email + "'AND Pswd= '" + Pswd + "'").then(([rows]) => {
                    console.log(rows)

                    session.LoggedIn=true;
                    session.staffID=rows[0].staffID
                    session.FirstName=rows[0].FirstName
                    session.LastName=rows[0].LastName
                    session.Email=rows[0].Email
                    session.Role=rows[0].Role
                    session.Pswd=rows[0].Pswd
                    
                    if(session.Role='Admin'){
                        console.log(`Admin`)
                        session.AccessRole='Admin'
                    }else{
                        session.AccessRole='Staff'
                    }
                })
                
            }
        })
    })
}

index.js

const express = require('express');
const app = express();
const path = require('path');
const exphbs = require('express-handlebars');
var session = require('express-session');
var bodyParser = require('body-parser');

// Middlewares
app.engine('handlebars', exphbs({defaultLayout: 'main'}));
app.set('view engine', 'handlebars')
app.use(express.urlencoded({extended: true}))


// Client routes
app.get('/', (req, res) => res.render('index'));

app.use('/admin', require('./routes/Admin'));
app.use('/login', require('./routes/Login'));


app.use(session({
    secret: 'secret',
    resave: true,
    saveUninitialized: true
}));
app.use(bodyParser.urlencoded({extended : true}));
app.use(bodyParser.json());



const PORT= process.env.PORT || 5000;

app.listen(PORT, () => console.log(`Server Started on port ${PORT} `)); 

Login.js(路由)

const express = require('express');
const router = express.Router();

var Login_controller =  require('../controllers/LoginController');

// Use the login.handlebars template
router.get('/', (req, res) => res.render("login"));

// CRUD routes
router.post("/submit-login", Login_controller.checksLogin);

module.exports = router;

Admin.js

const express = require('express');
const session = require('express-session');
const router = express.Router();

var pupils_controller =  require('../controllers/PupilsController');
var staff_controller = require('../controllers/StaffController')



// Use the login.handlebars template
router.get('/', (req, res) => {
    console.log(session.LoggedIn)
    if(session.AccessRole=='Admin'){
    res.render("admin")
    }
    else{
        console.log(`No Entry`)
        res.redirect('/')
    }
    
});

// CRUD routes
router.post('/create-pupil', pupils_controller.createPupil);
router.post('/delete-pupil', pupils_controller.deletePupil);
router.post('/create-staff', staff_controller.createStaff)


module.exports = router;

login.handlebars

<p> Log In </p>


<form method="POST" action="/login/submit-login">
    <label for="Email">Email</label><br>
    <input type="text" name="Email" /><br>
    <label for="Pswd">Password</label><br>
    <input type="text" name="Pswd" /><br>
    <input type="submit" />
</form>

使用 MYSQL 数据库、Node js 和 express

谢谢

【问题讨论】:

  • 注意,在你的 if 语句中你有 session.AccessRole='Admin' 这是一个赋值而不是一个比较

标签: javascript node.js express session


【解决方案1】:

请注意这里的 IF 语句必须有双等号才能比较,而不是你正在做一个赋值

const session = require('express-session');
var Login = require('../models/Login');

exports.checksLogin = async (req, res) => {
    // Implement this method using the pupil model
    console.log(req.originalUrl + "POST Received with query: ", req.body)
    const {Email, Pswd} =  req.body
    await Login.checkLogin(Email, Pswd)
    if(session.AccessRole == 'Admin') {
        res.redirect('/admin')
    } else {
    }
}

【讨论】:

  • 啊,谢谢,这对于不让任何人访问但现在管理页面无法访问他们的页面,因为 Login.js 功能仍然在 if 之后由于某种原因完成。你对此有什么想法吗?
  • 是的,在你的 checklogin 函数中,你正在调用一个异步函数或返回一个 promise,所以我建议你使用 async/await 来解决这个问题——更新了答案代码
  • 谢谢你这样解决了问题,但对不起,我不得不问另一个问题......我输入了你的代码,我必须按登录页面上的提交按钮两次才能重定向现在,任何想法。
  • 可能该函数正在调用 checkLogin 并没有等待承诺,您可以添加该代码以便我看一下吗?以及有关您使用的框架的一些信息
  • 您好,刚刚用其余代码更新了问题,如果您能看一下,真的很感激
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-03
  • 2016-11-21
  • 1970-01-01
  • 2019-03-01
  • 2013-01-17
  • 1970-01-01
相关资源
最近更新 更多