Mysql, Node, запрос внутри запроса, как заполнить свойство в функции карты из другого запроса - PullRequest
0 голосов
/ 29 апреля 2019

Во-первых, если кто-то может отредактировать заголовок или вопрос моего вопроса, чтобы сделать его более понятным, сделайте это.

У меня есть приложение node / express, выполняющее запросы mysql с помощью mysql.js.У меня есть запрос, который просматривает таблицу вопросов, а затем запускает функцию отображения результатов.В этой функции карты мне нужно запросить другую таблицу ответов, соответствующую каждой записи в таблице вопросов.Значение, которое мне нужно, это количество ответов на этот вопрос, то есть количество записей в каждой таблице ответов.Я пробовал разные примеры, но ничто не подходит для моего случая так, чтобы это имело смысл для меня.Новичок в Node и Express, и даже в MySQL, так что ему сложно разобраться, что именно.

Я понимаю, что проблема заключается в асинхронной природе узла.getAnswersCount () возвращает значение «count» до завершения запроса.Ниже мой код.Нужен некоторый совет о том, как этого добиться.

Значение 123 назначено для подсчета только для уточнения результатов трассировки.

app.get('/', (req, res) => {

db.query('SELECT * FROM questions LIMIT 0, 100',
  (error, results) => {
    if (error) throw error;

    questions = results.map(q => ({
      id: q.id,
      title: q.title,
      description: q.description,
      answers: getAnswersCount( q.id )
    }));

    res.send( questions );
  });

});

const getAnswersCount = ( id ) =>
{
  const tableName = 'answers_' + id;
  var count = 123;

  var sql = `CREATE TABLE IF NOT EXISTS ${tableName}(
                          id int primary key not null,
                          answer varchar(250) not null
                      )`;

  db.query( sql,
    (error, results) => {
      if (error) throw error;
      //console.log( 'answers table created!' );
  });

  sql = `SELECT COUNT(*) AS answersCount FROM ${tableName}`;

  db.query( sql,
    (error, results) => {
      if (error) throw error;

      //console.log( count ); // will=123
      count = results[0].answersCount;
      //console.log( count ); // will = results[0].answerCount
  });

  // I know this code runs before the query finishes, so what to do?
  //console.log( count ); //still 123 instead of results[0].answersCount

  return count;
}

РЕДАКТИРОВАТЬ: После попытки различных версий предложения Майкла Платта в егобезуспешного ответа я наконец-то разработал решение, используя обратные вызовы Express и обещание, добавив значения ответов в массив вопросов:

app.get( '/', (req, res, next ) => {

  db.query('SELECT * FROM questions LIMIT 0, 100',
    (error, results) => {
      if (error) throw error;

        questions = results.map(q => ({
        id: q.id,
        title: q.title,
        description: q.description,
      }));

      next();
    });

}, (req, res ) => {
  questions.map( currentElem => {

    getAnswersCount( currentElem.id ).then( rowData => {
      currentElem.answers = rowData[0].answersCount;

      if( currentElem.id == questions.length ) res.send( questions );
    });

  });
});

const getAnswersCount = ( id ) => {
  const tableName = 'answers_' + id;

  var sql = `CREATE TABLE IF NOT EXISTS ${tableName}(
                          id int primary key not null,
                          answer varchar(250) not null
                      )`;

  db.query( sql,
    (error, results) => {
      if (error) throw error;
      //console.log( 'answers table created!' );
  });

  sql = `SELECT COUNT(*) AS answersCount FROM ${tableName}`;

  return new Promise( ( resolve, reject ) => {
      db.query( sql, ( error, results ) => {
          if ( error ) return reject( err );
          resolve( results );
      });
  });
}

1 Ответ

0 голосов
/ 29 апреля 2019

Я не уверен, к какому модулю базы данных вы подключаетесь и запрашиваете базу данных, но вы можете сделать метод async, а затем ждать ответа от запроса следующим образом:

const getAnswersCount = async ( id ) =>
{
   const tableName = 'answers_' + id;
   var count = 123;

   var sql = `CREATE TABLE IF NOT EXISTS ${tableName}(
                      id int primary key not null,
                      answer varchar(250) not null
                  )`;

   var results = await db.query(sql);

   sql = `SELECT COUNT(*) AS answersCount FROM ${tableName}`;

   var count = db.query(sql)[0].answerCount;

   // I know this code runs before the query finishes, so what to do?
   //console.log( count ); //still 123 instead of results[0].answersCount

   return count;
}

app.get('/', async (req, res) => {
   db.query('SELECT * FROM questions LIMIT 0, 100',
      (error, results) => {
        if (error) throw error;
        questions = results.map(q => {
          const answerCount = await getAnswersCount( q.id )
          return {
             id: q.id,
             title: q.title,
             description: q.description,
             answers: answerCount
          }
        }));

    res.send( questions );
  });

});

Я думаю, что это даст вам то, что вы хотите, и работать правильно, но это может потребовать небольшой настройки.Возможно, вам также потребуется async функция на самом фактическом маршруте и дождаться вызова для getAnswersCount, но это должно вот-вот сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...