首页 > 解决方案 > 循环通过 json API 并将值插入 MySQL Node JS

问题描述

我正在尝试使用 Node JS 将特定数据从 WEB API 保存到我的 MySql 数据库,但我遇到了麻烦。 这是我的 API。
我需要从每个设备中获取以下值。

到目前为止,我一直在尝试使用以下代码,但它似乎只适用于最后一个 ID?我正在计算设备 ID 是否已经在我的数据库中,如果没有,它将添加设备以及所有数据。否则,它将连同值一起输出 ID(并更新数据库中的相应数据)。我的目标是每隔几秒钟请求一次 API,遍历每个设备 ID 并更新我的数据库。这是我想要实现的唯一解决方案,到目前为止它只是让我头疼。非常感谢任何知道如何实现这一目标或我做错了什么的人。

fetch('http://127.0.0.1:3000/test', settings)
    .then(res => res.json())
    .then((json) => {
        for (var i = 0; i < json.length; i++) {
            json.id = json[i].id;
            json.value = json[i].properties.value;
            json.name = json[i].name;
            json.type = json[i].type;
            json.enabled = json[i].enabled;
            connection.query('SELECT COUNT(*) AS exist FROM devices WHERE id = ? AND state = ?;', [json.id, "enabled"], function(error, rows, fields) {
                if (error) {
                    console.log(error);
                }
                if (rows[0].exist == 0) {
                    connection.query('INSERT INTO devices(id, name, value, type, state) VALUES( ? , ? , ? , ? );', [json.id, json.name, json.value, json.type, json.enabled], function(error, rows, fields) {
                        if (error) {
                            console.log(error);
                        }
                    });
                } else if (rows[0].exist == 1) {
                    console.log(json.id + ";" + json.value);
                }
            });
        };
    });

标签: node.jsjsonapi

解决方案


我认为这里的问题是您正在修改循环中的设备数组,这会导致一些奇怪的行为。

我建议填充一个单独的设备变量,然后在插入查询中使用它,如下所示:

fetch('http://127.0.0.1:3000/test', settings)
    .then(res => res.json())
    .then((json) => {
        for (var i = 0; i < json.length; i++) {
            console.log(`inserting device: ${i+1} of ${json.length}:`, json[i]);
            const device = { ...json[i], value: json[i].properties.value };
            connection.query('SELECT COUNT(*) AS exist FROM devices WHERE id = ? AND state = ?;', [device.id, "enabled"], function(error, rows, fields) {
                if (error) {
                    console.log(error);
                }
                if (rows[0].exist == 0) {
                    connection.query('INSERT INTO devices(id, name, value, type, state) VALUES( ? , ? , ? , ?, ? );', [device.id, device.name, device.value, device.type, device.enabled], function(error, rows, fields) {
                        if (error) {
                            console.log(error);
                        }
                    });
                } else if (rows[0].exist == 1) {
                    console.log(device.id + ";" + device.value);
                }
            });
        };
    });

我还必须将插入 SQL 查询修改为:

INSERT INTO devices(id, name, value, type, state) VALUES( ? , ? , ? , ?, ? );

推荐阅读