繁体   English   中英

使用 nodejs 在 JSON 中显示一对多结果

[英]Display One-to-Many result in a JSON with nodejs

你好,我有这个模型:网关 -serial -name -ip

设备 -uui -vendor -name -gw_serial

网关有 1 个或多个设备的地方

我需要使用 SQLITE3 在 nodejs 中的 rest/api 中显示这样的结果:

{
serial: 123,
name: Huawei,
ip: 192.168.12.1,
devices:[
{
 uuid: 888,
 vendor: Intel,
 name: mouse,  
},

{
 uuid: 999,
 vendor: Intel,
 name: keyboard,  
}

],
serial: 345,
name: Apple,
ip: 192.168.12.3,
devices:[
{
 uuid: 567,
 vendor: Intel,
 name: mouse,  
},

{
 uuid: 893,
 vendor: Intel,
 name: keyboard,  
}

]
}

我假设您正在使用node-sqlite3 我还没有用真实的数据库测试过它,但在这里我做了一些功能的模拟和演示。

也许这就是你需要的:

const get_grouped = async (db) => {
    return new Promise((resolve, reject) => {
        const sql = `
        SELECT serial,
               gateways.name AS gw_name,
               uuid,
               vendor,
               devices.name
        FROM   gateways
               JOIN devices
                 ON gateways.serial = gw_serial
        `;
        const acc = {};
        db.each(sql, (error, gw_dev) => {
            if(error) return reject(error);
            acc[gw_dev.serial] = acc[gw_dev.serial] || {
                serial: gw_dev.serial,
                name: gw_dev.gw_name,
                ip: gw_dev.ip,
                devices: []
            };
            acc[gw_dev.serial].devices.push({
                uuid: gw_dev.uuid,
                vendor: gw_dev.vendor,
                name: gw_dev.name,
            });
        }, (error, rows) => error ? reject(error) : resolve(Object.values(acc)));
    });
};

基本上你将数据库实例传递给这个函数。

在每一行上,结果都存储在acc变量中。 如果没有带有该串行的网关,则对其进行初始化。 然后设备只是被推送到它的集合。 当然,这假设每个网关的串行是唯一的,但它应该是。

如果没有错误,则调用oncomplete回调时,结果将显示为acc的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM