Javascript 在节点会话中将访问级别创建为函数

Javascript 在节点会话中将访问级别创建为函数,javascript,node.js,session,rbac,Javascript,Node.js,Session,Rbac,我正在尝试使用会话在Node.js中创建访问级别。例如,如果用户名是“test”,它可以查看某个页面。如果用户名为“admin”,则无法查看同一页面。用户名存储在MySQL表“accounts”中。该表具有列属性“username”。我一直在尝试不同的东西,但我似乎无法让它发挥作用 以下是我的JS代码: app.get('/ViewPage', function(request, response) { var connection = request.app.get('pool');

我正在尝试使用会话在Node.js中创建访问级别。例如,如果用户名是“test”,它可以查看某个页面。如果用户名为“admin”,则无法查看同一页面。用户名存储在MySQL表“accounts”中。该表具有列属性“username”。我一直在尝试不同的东西,但我似乎无法让它发挥作用

以下是我的JS代码:

app.get('/ViewPage', function(request, response) {
    var connection = request.app.get('pool');

    if (request.session.loggedin) {
    var username;

    connection.query('SELECT username FROM accounts WHERE username = test', function (error, results, fields) {
        if (username == "test") {
            // do the command here
        } else if (username == "admin"){
            response.redirect('/');
        }   
    });
    } else {
        response.redirect('/');
    }
});

编辑: 我更新了我的代码如下,但它不断循环到“管理员无法查看此页面”否则如果块

app.get('/Create_Award', function (request, response) {
var connection = request.app.get('pool');

    if (request.session.loggedin) {
    connection.query('SELECT username FROM accounts', function (error, results, fields) {
    { account: results[0] };
        if (error) {
            console.log(error);
        }
        else {
            if (results[0].username === "test") {
                connection.query('SELECT accounts.id, accounts.username, awardType.id as awardTypeId, awardType.title FROM accounts JOIN awardType WHERE username = ?', [request.session.username], function(error, results, fields) {
                    response.render('Create_Award.html', { account: results[0], data: results });
                    console.log('Test account.');
                }); //2nd connection
            }
            else if (results[0].username === "admin") {
                response.redirect('/');
                console.log('Admin cannot view this page.');
            }
            else {
                response.redirect('/');
            }
        }
    }); //1st connection
    } else {
        response.redirect('/');
    }
});

您永远不会填充您的
var用户名
,因为它将始终是
未定义的
,并且您的代码将转到
else

       app.get('/ViewPage', function (request, response) {
    var connection = request.app.get('pool');

    if (request.session.loggedin) {

        connection.query('SELECT username FROM accounts WHERE username = test', function (error, results, fields) {
            if (error) {
                console.log(error);
            }
            else {
                if (results[0].username === "test") {
                    response.redirect('/myCustom');
                }
                else if (results[0].username === "admin") {
                    response.redirect('/');
                }
                else {
                    response.redirect('/');
                }
            }

        });
    } else {
        response.redirect('/');
    }
});
更新你的代码,它就会工作

编辑-从更新后的代码中我可以看出,唯一不正确的是如何使用
res.render
。看一看,它需要一个
回调函数

在你的代码中试试这个,如果有效,请告诉我

response.render('Create_Award.html', { account: results[0], data: results },(err,html)=>{
          res.send(html)
});
app.get(“/viewpage”),异步函数(req,res){
var connection=req.app.get(“池”);
if(res.session.loggedin){
试一试{
const result=wait connection.query(
“从username=test的帐户中选择*”
);
如果(结果[0]。用户名==“测试”){
//某物
}else if(结果[0]。用户名=“admin”){
//某物
}
}捕获(错误){
//您可以记录错误
返回res.redirect(“/”);
}
}
返回res.redirect(“/”);
});
这里有一些事情需要注意

1)使用异步/等待。它使代码更具可读性,因为查询检索数据可能需要一些时间。还将其全部封装在try/catch块中,以便在出现错误时处理错误

2)您的查询回调未被使用。您应该使用results参数以回调方式检索数据


3)根据我的意见,请务必尝试返回响应,否则您可能会收到“路由错误:发送后无法设置标题”

1。“用户名”在哪里定义?2.“else if”是无法访问的。3.你在connection.queryHello中缺少了“else”,我已经像上面一样更新了我的代码,但是它一直循环回“admin”else if块。请查看编辑