有关使用node-postgres和渲染页面的Node js中的回调的问题

时间:2019-02-12 15:58:29

标签: node.js postgresql node-postgres

我有一个带用户表的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');
  });

2 个答案:

答案 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}}变量。