有关使用node-postgres和render page的节点js中的回调的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有关使用node-postgres和render page的节点js中的回调的问题相关的知识,希望对你有一定的参考价值。

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

    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');
  });

答案

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

Update

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

另一答案

我想,你需要在pool.query函数中的回调内部进行重定向。

以上是关于有关使用node-postgres和render page的节点js中的回调的问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 node-postgres 监听查询超时?

如何使用 node-postgres 进行批量插入

使用 node-postgres 更新数据的更简单方法?

使用 node-postgres 在 postgres 中存储文件

将 Async/Await 与 node-postgres 一起使用

使用 node-postgres 查询的 Promise 总是返回 undefined