#javascript
#javascript
Вопрос:
Я запрашиваю objects
таблицу в axios следующим образом:
app.get(`/details`, (req, res) => {
const { id } = req.query;
connection.query(
`SELECT
objects.*
FROM objects
WHERE id = ${id}
LIMIT 1`,
(err, results) => {
if (err) {
return res.send(err);
} else {
let result = results[0];
result.relationships = [];
result.tasks = [];
return res.json(result);
}
}
);
});
Как я могу добавить следующие два запроса к моему результату results.relationship
:
`SELECT objects.* FROM objects WHERE objects.relationship = ${result.id}
и к моему результату results.tasks
:
`SELECT tasks.* FROM tasks WHERE tasks.relationship = ${result.id}
Комментарии:
1. Поправьте меня, если я ошибаюсь, но какое это имеет отношение к axios?
2. Вы можете просто продолжать переходить к следующему обратному вызову; таким образом, внешние переменные будут доступны в любое время. Или вы переключаетесь на Promises и используете
await
, гораздо лучшее решение.3. Если это не имеет ничего общего с axios, поправьте меня, и я обновлю теги.
4. Похоже, вы должны сначала пообещать это при создании объекта подключения. перейдите по этой ссылке, после чего вы сможете использовать .then() как promise или await . codota.com/code/javascript/functions/mysql/Connection/query
5. @ChrisG Спасибо. Можете ли вы включить это в ответ? Я не знаю, как перенести эту подсказку в код. Было бы очень полезно.
Ответ №1:
Вот рабочее решение, вытекающее из комментариев. Спасибо @Chris G.
app.get(`/details`, (req, res) => {
const { id } = req.query;
const query = util.promisify(connection.query).bind(connection);
(async () => {
try {
let [
object,
] = await query(`SELECT objects.* FROM objects WHERE id = ? LIMIT 1`, [
id,
]);
const relatedObjects = await query(
`SELECT objects.* FROM objects WHERE relationship = ?`,
[id]
);
object.relationships = relatedObjects;
const tasks = await query(
`SELECT tasks.* FROM tasks WHERE relationship = ?`,
[id]
);
object.tasks = tasks;
return res.json(object);
} catch (error) {
console.log(error);
} finally {
connection.end();
}
})();
});