Вопросы о обратных вызовах в узле js с использованием node-postgres и страницы рендеринга - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть postgresSql с таблицей пользователей (username, password e administrator(boolean)).Как только я сделаю свой запрос (SELECT * FROM users WHERE username=$1 AND password=$2'), я хотел бы проверить, равен ли администратор истине, затем перенаправить на страницу администратора, если ложно, перенаправить на страницу normalClient.У меня сложное понимание обратного вызова.Первый может получить ошибку или результат, но если я получаю результат, мне нужно проверить, если администратор == 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 голосов
/ 12 февраля 2019

Что касается вашей особой проблемы, вам нужно переместить res.redirect('/adminDashboard'); в свой блок else.Также читая предыдущие комментарии, я обнаружил, что вы используете переменную res в нескольких местах - router.post('/login',(req,res,next)=> { и pool.query(text, values, (err, res) => {.Назовите значение, отличное от res, в любом месте.

Поскольку вы упомянули, что у вас возникают трудности с пониманием обратного вызова, вот небольшое вступление.Всякий раз, когда вы выполняете функцию в Javascript, вам необходимо проверить, выполняется ли эта функция синхронно или асинхронно.Если async, как и функция pool.query, вам нужно предоставить обратный вызов - по сути, еще один метод, который необходимо запустить, когда данные извлекаются из исходного метода.

Когда Javascript начинает выполнять ваш код, он вызоветметод pool.query, но он не будет ждать результатов!Вместо этого он пойдет и выполнит строку кода res.redirect('/adminDashboard');.Вот почему вам нужно переместить эту строку в ваш обратный вызов.

И в этом вся прелесть Javascript.Запуск методов async делает вашу программу быстрее, потому что теперь ваш поток не сидит без дела.Он не ждет результатов, но выполняет следующую операцию.Он вернется и выполнит функцию обратного вызова, когда ваш оригинальный метод будет выполнен и вернул данные обратно.

Обновление

В соответствии с вашим комментарием, если вы переименуете res в вашем пуле, какэто, pool.query(text, values, (err, queryRes) => {, вы все равно можете сделать res.redirect('/adminDashboard'); внутри блока else, потому что у вас все еще есть доступ к родительской переменной res.

0 голосов
/ 12 февраля 2019

Я думаю, вам нужно сделать перенаправление внутри функции обратного вызова в pool.query функции.

...