У вас есть несколько проблем там, во-первых, конец вашей функции, где вы хотите вернуть строки. Строки не определены, так как они находятся только в области обратного вызова sql.
Следующее, что, даже если ваша переменная строк была определена, в тот момент, когда вы вернетесь, sql не вернет данные тем не менее, вы должны вернуть некоторую пустую переменную.
Причина, по которой этот обратный вызов существует, заключается в том, чтобы иметь возможность ждать sql, чтобы вернуть данные, и как только sql имеет строки, чтобы использовать их внутри обратного вызова .
Самая базовая c реализация выглядела бы так:
router.get('/', async(req, res) => {
const sql = 'SELECT `title`, `description`, `keyword` FROM `metas` WHERE `url`="-"'
db.query(sql, (err, rows) => {
if(err) throw err;
const reactComp = renderToString(<Index />);
res.status(200).render('pages/index', { reactApp: reactComp, title: rows })
});
})
Видите ли, мы ждем, пока данные поступят внутри обратного вызова и вернут оттуда наш ответ.
Теперь могут быть причудливые способы обернуть это в обещание или что-то в этом роде:
function getMeta() {
const sql = 'SELECT `title`, `description`, `keyword` FROM `metas` WHERE `url`="-"'
// wrapping the query in a promise
return new Promise((resolve, reject) => {
db.query(sql, (err, rows) => {
if(err) reject(err);
resolve(rows)
});
})
}
// now we can use the await keyword
router.get('/', async(req, res) => {
const meta = await getMeta()
console.log('meta', meta)
const reactComp = renderToString(<Index />)
res.status(200).render('pages/index', { reactApp: reactComp, title: meta })
})