![](/img/trans.png)
[英]How to get an array into SQlite3 with Express + 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.