我有一个带用户表的PostgresSql (username, password e administrator(boolean))
。进行查询(SELECT * FROM users WHERE username=$1 AND password=$2')
后,我想检查Administrator是否等于true,然后重定向到Administrator页面,如果为false,则重定向到normalClient页面。
我对回调的理解很困难。第一个可能会收到错误或结果,但是如果我收到结果,则需要检查administrator == true,然后重定向到管理页面,否则重定向到客户端页面
router.post('/login',(req,res,next)=> {
let text = 'SELECT * FROM users WHERE username=$1 AND password=$2';
let values = [req.body.username,req.body.password];
//callback
//make query
pool.query(text, values, (err, res) => {
// if error print
if (err) {
console.log(err.stack)
//if receive result print
} else {
console.log(res.rows[0].administrator)
// { name: 'brianc', email: 'brian.m.carlson@gmail.com' }
}
});
res.redirect('/adminDashboard');
});
答案 0 :(得分:1)
我认为,您需要在pool.query
函数的回调内部进行重定向。
答案 1 :(得分:0)
关于特定问题,您需要将res.redirect('/adminDashboard');
移到else
块内。还要阅读以前的评论,我发现您在多个地方使用res
变量-router.post('/login',(req,res,next)=> {
和pool.query(text, values, (err, res) => {
。在任一位置调用res
以外的值。
由于您提到您在理解回调方面遇到困难,因此这里有一些介绍。每当您使用Javascript执行某个功能时,都需要检查该功能是同步运行还是异步运行。如果异步,例如函数pool.query
,则需要提供回调-本质上是从原始方法中提取数据时需要运行的另一种方法。
当Javascript开始执行您的代码时,它将调用pool.query
方法,但不会等待结果!相反,它将去执行res.redirect('/adminDashboard');
行代码。这就是为什么需要在回调中移动此行的原因。
这就是Javascript的美。让方法异步运行可以使您的整个程序更快,因为现在您的线程不再处于空闲状态。它不等待结果,而是执行下一个操作。完成原始方法并返回数据后,它将返回并执行回调函数。
根据您的评论,如果您像这样res
重命名池中的pool.query(text, values, (err, queryRes) => {
,则仍然可以在else块内执行res.redirect('/adminDashboard');
,因为您仍然可以访问父级{ {1}}变量。