簡體   English   中英

帶有 knex 和 node.js 的嵌套數組

[英]Nested array with knex and node.js

我目前在數據庫中有一個用於注冊系統菜單的表,它被稱為菜單,並且有一個字段 id_menu、dsc_menu 和 parent_item。 Id_menu 是自動增量的,而 parent_item 接收其主菜單項的 id_menu。 在這種情況下,它們成為子菜單。 事實證明,我已經嘗試以多種方式通過嵌套我的查詢來生成 json,即主菜單項,如果有一個,則包含一個包含相關項的子菜單的節點。 我考慮進行第一個查詢,它只會給我帶來主菜單,然后我會在這個數組中做一個 foreach,獲取 id_menu 並現在只針對具有 parent_item = id_menu 的項目進行新查詢。 然后我可以再次連接這些數據並將其轉換為一個完整的數組。 我在我的想法下面做了一個大綱,但是,它不起作用。

// here I take all the parent menus
var result = await knex.raw("SELECT * FROM menus WHERE parent_item is null");

result[0].forEach(element => { 

    // Here I need to use the parent menu id to get the child menus and add them to a new array that will be inside the "submenus" element of the main array.
    if(element.num_sub_menus > 0) {
         var jsonSubMenus = await knex.raw("SELECT dsc_menu FROM menus WHERE parent_item = ?", element.num_sub_menus);
         // if I try to call the knex again here, using await, it gives an error and if I don't use awaita it returns an empty promisse.
    }

    resultado += '{';
    resultado += '"id_menu_admin": ' + element.id_menu_admin + ',';
    resultado += '"dsc_menu": "' + element.dsc_menu + '",';
    resultado += '"parent_item": ' + element.parent_item + ',';
    resultado += '"rota": "' + element.rota + '",';
    resultado += '"icone": "' + element.icone + '",';
    resultado += '"num_sub_menus": ' + element.num_sub_menus + ',';
    resultado += '"submenus": ['+jsonSubMenus+']';
    resultado += '},';}
);

對於子查詢,例如,如果我不使用 await,則返回一個空的 promise,或者如果我使用 await,則給出編譯錯誤。

我想必須有一種更專業的方式來做到這一點,通過單個查詢帶來一個嵌套數組。 記住我的菜單項和子菜單在同一個表中。

雖然您可以使用for循環而不是forEach以便在內部允許await ,但最好使用稍微不同的方法 - 使用Promise.all以便一次並行查詢所有子菜單,然后構造resultado .

看起來resultado是 JSON,因此您應該使用 object 文字,然后使用JSON.stringify而不是手動連接。 類似於以下內容:

const getSubmenus = elm => elm.num_sub_menus > 0
  ? knex.raw("SELECT dsc_menu FROM menus WHERE parent_item = ?", elm.num_sub_menus)
  : null;
const withSubmenus = await Promise.all(result[0].map(
  elm => Promise.all([element, getSubmenus(element)])
);
const resultArr = withSubmenus.map(([e, submenus]) => ({
  id_menu_admin: e.id_menu_admin,
  dsc_menu: e.dsc_menu,
  // ...,
  ...(submenus ? { submenus } : {})
}));
const resultJSON = JSON.stringify(resultArr);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM