Как сделать mysql «лестничные» запросы в nodejs с экспресс

0

У меня возникла проблема, когда я хочу сделать запросы в форме "лестницы" с nodejs, express и mysql и вернуть один json. Это не работает для меня, структура, которую я хочу сделать:

select dev_id*,dev_name from devices
select cont_id*, cont_name from controllers where dev_id = dev_id
select act_id, acti_id from actions where cont_id = cont_id**

return json({devices,{controller,{actions}}})

Я использую функцию forEach, а также пытаюсь использовать функцию обратного вызова.

  • 0
    Что вы подразумеваете под лестничными запросами? Что dev_id* и cont_id** ?
  • 1
    where dev_id = dev_id верно для каждой строки.
Показать ещё 4 комментария
Теги:
express

1 ответ

0

Вам нужно присоединиться ко всем 3 таблицам, а затем просмотреть результаты и построить вложенные объекты.

var mysql = require("mysql");
var con = mysql.createConnection({
  host: "localhost",
  user: "yourusername",
  password: "yourpassword",
  database: "mydb"
});
var sql = 'SELECT d.dev_id, d.dev_name, c.cont_id, c.cont_name, a.act_id, a.acti_id
           FROM devices AS d
           LEFT JOIN controllers AS c ON c.dev_id = c.dev_id
           LEFT JOIN actions AS a ON a.cont_id = c.cont_id';
con.connect(err => {
    if (err) {
        throw err;
    }
    conn.query(sql, (err, result, fields) => {
        if (err) {
            throw err;
        }
        var devices = {};
        $result.forEach(({dev_id, dev_name, cont_id, cont_name, act_id, acti_id}) => {
            devices[dev_id] = devices[dev_id] || {id: dev_id, name: dev_name, controllers: {}};
            devices[dev_id].controllers[cont_id] = devices[dev_id].controllers[cont_id] || {id: cont_id, name: cont_name, actions: {}};
            devices[dev_id].controllers[cont_id].actions[act_id] = {id: act_id, acti_id: acti_id};
        });
    });
    // do something with devices here
});

Помните, что весь код запроса mysql является асинхронным, поэтому вы не можете нормально возвращать значения. Вам нужно использовать обратные вызовы или обещания.

Переменная devices будет выглядеть так:

{
    devid1: {
        id: "devid1",
        name: "devname1",
        controllers: {
            contid1: {
                id: "contid1",
                name: "contname1",
                actions: {
                    actionid1: {
                        id: "actionid1",
                        acti_id: "acti_id1"
                    },
                    actionid2: {
                        id: "actionid2",
                        acti_id: "acti_id2"
                    }
                }
            },
            contid2: {
                id: "contid2",
                name: "contname2",
                actions: {
                    actionid3: {
                        id: "actionid3",
                        acti_id: "acti_id3"
                    }
                }
            }
        |
    }
}
  • 0
    Привет, Бармен, я тестирую твой код, sql работает, но последняя часть выдает ошибку: var devices = {}; $ result.forEach ({dev_id, dev_name, cont_id, cont_name, act_id, acti_id} => {devices [dev_id] = devices [dev_id] || {id: dev_id, name: dev_name, контроллеры: {}}; устройства [dev_id ] .controllers [cont_id] = устройства [dev_id] .controllers [cont_id] || {id: cont_id, имя: cont_name, actions: {}}; устройства [dev_id] .controllers [cont_id] .actions [act_id] = {id : act_id, acti_id: acti_id};});
  • 0
    В чем ошибка?
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню