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

Questions about callbacks in node js using node-postgres and render page

我的 postgresSql 有 table 个用户(username, password e administrator(boolean))。一旦我进行查询 (SELECT * FROM users WHERE username= AND password=') 我想检查管理员是否等于 true,然后重定向到管理员页面,如果是 false 则重定向到 normalClient 页面。 我很难理解回调。第一个可以收到错误或结果,但如果我收到结果,我需要检查管理员是否 == true 然后重定向到管理页面,否则重定向到客户端页面

    router.post('/login',(req,res,next)=> {
      let text = 'SELECT * FROM users WHERE username= AND password=';
      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');
  });

我认为,您需要在 pool.query 函数的回调内部进行重定向。

关于您的具体问题,您需要将 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 的魅力所在。使用方法 运行 async 可以使您的整个程序更快,因为现在您的线程不会闲置。它不等待结果,而是去执行下一个操作。当您的原始方法完成并返回数据时,它将返回并执行回调函数。

更新

根据您的评论,如果您将池中的 res 重命名为 pool.query(text, values, (err, queryRes) => {,您仍然可以在 else 块中执行 res.redirect('/adminDashboard');,因为您仍然可以访问父 res 变量。