Узел + Express - Получение dbData перед рендерингом - PullRequest
1 голос
/ 03 марта 2020

Я пытаюсь визуализировать представление с таблицей данных, полученных из локальной базы данных. Запрос и все данные проверяются в формате, который я хочу. Но прежде чем данные извлекаются, представление отображается, и я получаю сообщение об ошибке.

Это мой маршрут. js, где я ожидал бы найти ошибку.

exports.getIndex = (req, res) {
  const result = sqldb.GetSubscribers()
  try{
      res.render('subscribtions/index', {
        moment: moment,
        subs : result,
        pageTitle: 'Subscribtions',
        path: '/subscribtions'
        })
      }
  catch(error)
      {
        console.log(error)
        res.redirect(404, '../views/404.ejs');
      }
}; 

DBcall только для ориентации

exports.GetSubscribers = function() {
    const connString = "ConnectionString";

    query = "Some Long Query" 

    sql.open(connString, (err, con) => {
        if (err) {
        console.log('failed to open ' + err.message)
        }
        con.prepare(query, (err, ps) => {
            if (err) {
                console.log('Fejl - prepare: '+err.message)
                return
            }
            con.query(query, (err, rows) => {
                if (err) {
                    console.log('Fejl - query: '+ err.message)
                    return err;
                }
                console.log("Returning results...")
                return rows;
            })
        })
    })
}

Пока у меня есть пытался понять, как использовать async / await или Promise, но безуспешно. Может ли кто-нибудь из вас, блестящие умы, направить меня в правильном направлении?

1 Ответ

2 голосов
/ 03 марта 2020

Возможно, причина в том, что вызов db является асинхронным c, и, поскольку вы не ожидаете его, он вернет визуализированное представление до того, как данные будут полностью извлечены.

Таким образом, вам нужно дождаться вызов к базе данных. Учитывая, что функция является ожидаемой:

exports.getIndex = async (req, res) => {
  ...
  try {
     const result = await sqldb.GetSubscribers();
  }
  catch(err) {
     console.log('Error getting subscribers', err);
  }
  ...
};

В качестве альтернативы, если функция тогда способна:

exports.getIndex = (req, res) => {
  return sqldb.GetSubscribers().then(result => 
    res.render('subscribtions/index', {
      moment: moment,
      subs : result,
      pageTitle: 'Subscribtions',
      path: '/subscribtions'
    })
  .catch(error => {
    console.log(error);
    res.redirect(404, '../views/404.ejs');
  }));
}

Чтобы функция GetSubscribers вернула обещание:

exports.GetSubscribers = () => {
  const connString = 'ConnectionString';

  query = 'Some Long Query';

  return new Promise((resolve, reject) => {
    sql.open(connString, (err, con) => {
      if (err) {
        console.log(`failed to open ${err.message}`);
      }
      con.prepare(query, (err, ps) => {
        if (err) {
          console.log(`Fejl - prepare: ${err.message}`);
          reject();
        }
        con.query(query, (err, rows) => {
          if (err) {
            console.log(`Fejl - query: ${err.message}`);
            reject(err);
          }
          console.log('Returning results...');
          resolve(rows);
        });
      });
    });
  });
};
...