javascript - 循环遍历数组并根据先前查询的结果对数组中的每个条目执行 My SQL 查询

标签 javascript mysql node.js asynchronous async.js

我有一系列项目:

var myArr = ['item1', 'item2', 'item3'];

我正在尝试循环这些项目并检查它们是否存在于我的数据库中。如果该项目不存在,那么我将其添加到数据库中。

var sql = 'Select * from DB where item="' + myArr[i] + '"';
connection.query(sql, function(e, r, f) {
    if(!e && r.length <= 0) {
        performInsertOnDB(myArr[i]);
    }
});

我的问题是,对变量 i 的引用不会保留,因为 connnection.query 是异步的。我需要等到第一个选择完成才能继续。我正在尝试使用异步库来完成此任务,但我不能完全掌握如何执行该任务。

这是我到目前为止所拥有的:

async.each(lootArray, function(lootItem, addLootItem) {
    var sql = "SELECT * FROM loot_history WHERE date = DATE('" + moment(lootItem[1]).format('YYYY-MM-DD') + "') AND time = '" + lootItem[2] + "' AND itemId = " + lootItem[4];
    connection.query(sql, function(error, results, fields) {
        if (error) {
            sendDiscordMessage(loachannel, error + ', <@105094681141977088>');
            return false;
        } else {
            if (results.length > 0) {
                //duplicates.push(lootArray[i]);
            } else {
                addLootItem(lootItem);
            }
        }
    });
}, function(err) {
    // if any of the file processing produced an error, err would equal that error
    if (err) {
        // One of the iterations produced an error.
        // All processing will now stop.
        console.log('A file failed to process');
    } else {
        console.log('All files have been processed successfully');
    }
});

function addLootItem(lootItem) {
    var sql = "INSERT INTO loot_history SET player = " + lootItem[0] + ", date = " + moment(lootItem[1]).format('YYYY-MM-DD') + ", time = '" + lootItem[2] + ", item = " + lootItem[3] + ", itemId = " + lootItem[4] + ", itemString=" + lootItem[5] + ", response= " + lootItem[6] + ", votes= " + lootItem[7] + ", class= " + lootItem[8] + ", instance=" + lootItem[9] + ", boss=" + lootItem[10] + ", gear1=" + lootItem[11] + ", gear2=" + lootItem[12] + ", reasponseId=" + lootItem[13] + ", isAwardReason=" + lootItem[14];
    connection.query(sql, function(error, results, fields) {
        if (error) {
            sendDiscordMessage(loachannel, error + ', <@105094681141977088>');
        }
    });
}

编辑:一切正常,除了回调 AddLootItem 没有触发。为什么这个回调没有被调用?我可以在执行的 if 语句中设置日志事件,但函数本身永远不会触发。

最佳答案

问题是异步回调的名称与您想要在项目不存在时调用的函数相同。尝试将函数中的名称更改为其他名称(例如:callback),并在 if 语句中调用它或将其传递给 addLootItem,并在添加项目后调用它。

async.each(lootArray, function(lootItem, callback) {
    var sql = "SELECT * FROM loot_history WHERE date = DATE('" + moment(lootItem[1]).format('YYYY-MM-DD') + "') AND time = '" + lootItem[2] + "' AND itemId = " + lootItem[4];
    connection.query(sql, function(error, results, fields) {
        if (error) {
            sendDiscordMessage(loachannel, error + ', <@105094681141977088>');
            calback(err);
        } else {
            if (results.length > 0) {
                //duplicates.push(lootArray[i]);
                callback();
            } else {
                addLootItem(lootItem, callback);
            }
        }
    });
}, function(err) {
    // if any of the file processing produced an error, err would equal that error
    if (err) {
        // One of the iterations produced an error.
        // All processing will now stop.
        console.log('A file failed to process');
    } else {
        console.log('All files have been processed successfully');
    }
});

function addLootItem(lootItem, done) {
    var sql = "INSERT INTO loot_history SET player = " + lootItem[0] + ", date = " + moment(lootItem[1]).format('YYYY-MM-DD') + ", time = '" + lootItem[2] + ", item = " + lootItem[3] + ", itemId = " + lootItem[4] + ", itemString=" + lootItem[5] + ", response= " + lootItem[6] + ", votes= " + lootItem[7] + ", class= " + lootItem[8] + ", instance=" + lootItem[9] + ", boss=" + lootItem[10] + ", gear1=" + lootItem[11] + ", gear2=" + lootItem[12] + ", reasponseId=" + lootItem[13] + ", isAwardReason=" + lootItem[14];
    connection.query(sql, function(error, results, fields) {
        if (error) {
            sendDiscordMessage(loachannel, error + ', <@105094681141977088>');
        }
        done();
    });
}  

关于javascript - 循环遍历数组并根据先前查询的结果对数组中的每个条目执行 My SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44890484/

相关文章:

javascript - 按键和值过滤数组

javascript - 过渡后的 v-if 下方的过渡元素

php - 如何将对象和/或多维数组从 Javascript 传递到 PHP

php - CakePHP 3.0 数据库修改

node.js - 如何在express/mongoose中创建访问控制

node.js - Azure 中托管的 Node 服务器上的 Websocket 失败

node.js - loopback 4中如何编写单元测试用例

javascript - 如何使用 sinon.js 模拟/监视 javascript 函数中提到的对象?

mysql - 我应该将值存储在数据库中还是 XML 或文本文件中?

mysql - 按日期分片跟踪表有缺点吗?