Я пытаюсь вернуть несколько таблиц данных из контроллера узла. Я знаю, что мог бы сделать это как один запрос с несколькими объединениями, но я явно хочу вернуть различные таблицы в виде отдельных объектов.
У меня есть следующее:
var db = new sqlite3.Database('database.sqlite', sqlite3.OPEN_READONLY);
module.exports = function(req, res) {
var data = { tables: {} };
db.serialize(function() {
db.get(`
SELECT *
FROM Table1
WHERE id = ?
`, [req.params.id], (err, row) => {
if (row) data.tables.Table1 = row;
});
db.get(`
SELECT *
FROM Table2
WHERE id = ?
`, [req.params.id], (err, row) => {
if (row) {
data.tables.Table2 = row;
db.get(`
SELECT *
FROM Table2a
WHERE id = ?
`, [data.tables.Table2.SubA], (err, row) => {
if (row) data.tables.Table2a = row;
});
db.get(`
SELECT *
FROM Table2b
WHERE id = ?
`, [data.tables.Table2.SubB], (err, row) => {
if (row) data.tables.Table2b = row;
});
}
});
db.get(`
SELECT *
FROM Table3
WHERE id = ?
`, [req.params.id], (err, row) => {
if (row) data.tables.Table3 = row;
res.render('info', data);
});
}
}
Однако "Представление info отображает только таблицы 1, 2 и 3, а не таблицы 2a и 2b. Я мог бы понять это, если запросы выполняются параллельно, а таблица 3 запрашивается раньше, чем 2a и 2b, но я думаю, что функция db.serialize
должна предотвратить это. Как мне сделать это правильно?
Ожидаемый объект данных должен быть:
data: { tables: { Table1: { ... }, Table2: { ... }, Table2a: { ... }, Table2b: { ... }, Table3: { ... } }