Во-первых, если кто-то может отредактировать заголовок или вопрос моего вопроса, чтобы сделать его более понятным, сделайте это.
У меня есть приложение 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 );
});
});
}