Узел MySQL - потерян во вложенных запросах - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь выполнить несколько разных запросов перед выполнением окончательного запроса, основываясь на результатах предыдущих двух. Общая идея такова:

  • Вставить элемент
  • Получить itemId из InsertId
  • L oop через теги
    • Если тег уже существует , получите tagId
    • Если тег не существует, вставьте его и получите tagId
    • Теперь любой из вышеуказанных запросов завершен, и у нас есть itemId и tagID, вставьте связь между itemId и tagId

Вот мой код -

router.post('/item/add3', async function (req, res, next) {
var item = {};
let responseJson = {}
let hasTags = false;
var userId = req.session.userid;

if (Array.isArray(req.body.tags)) {
    hasTags = true;
}

item.label = req.body.label;
item.url = req.body.url;
item.created = new Date();
let insertQuery = "INSERT INTO " + table + " SET ?";

db.query(insertQuery, item, function (err, response) {
    if (err) {
        console.log("Errror block", err);
        return res.status(500).send(getMsg("INTERNAL_SERVER_ERROR", err));
    } else {
        let itemId = response.insertId;
        responseJson.insertId = itemId;
        if (hasTags) {
            //clean up hashtags
            let new_tagsList = [];
            console.log("count==" + req.body.tags.length);
            for (let i = 0; i < req.body.tags.length; i++) {
                let tag_value = req.body.tags[i].trim();
                new_tagsList.push(tag_value);
            }
            var filteredArray = new_tagsList.filter(function (item, pos) {
                return new_tagsList.indexOf(item.toLowerCase()) == pos;
            });
            //// finish clean up
            let tagStrings = filteredArray;
            let tagsList = [];
            for (let tagIndex = 0; tagIndex < tagStrings.length; tagIndex++) {
                console.log(tagStrings[tagIndex]);

                // Check if tag already exists
                let query = "select id from tag where label = '" + tagStrings[tagIndex] + "'";
                console.log(query);
                db.query(query, function (err, tag) {
                    if (err) {
                        console.log('tag errpr')
                        return res.status(500).send(getMsg("INTERNAL_SERVER_ERROR", err));
                    }
                    if (tag.length) {
                        //get tagID to add the relationship
                        console.log('tag  exist')
                        var tagId = tag[0].id;
                    } else {
                        // Tag doesn't exist so add it into table
                        console.log('tag doesnt exist')
                        let tagObj = {
                            label: tagStrings[tagIndex],
                            created: new Date(),
                            modified: new Date()
                        }
                        let insertQuery = "INSERT INTO tag SET ?";
                        db.query(insertQuery, tagObj, function (err, response) {
                            if (err) {
                                console.log("Errror block", err);
                                return res.status(500).send(getMsg("INTERNAL_SERVER_ERROR", err));
                            } else {
                                console.log("insert success")
                                var tagId = response.insertId
                            }
                            /// Now loses the chain 
                        });
                    }
                    // Add the relational link
                    var querytg = "INSERT INTO tagged (itemId, tagId, userId) VALUES ('" + itemId + "', '" + tagId + "', '" + userId + "')";
                    console.log(querytg)
                    db.query(querytg, function (err, response) {
                        if (err) {
                            console.log("Errror block", err);
                            return res.status(500).send(getMsg("INTERNAL_SERVER_ERROR", err));
                        } else {
                            console.log('tag relationship added')
                        }
                    });

                });
            }
            // is this when everything is finished?
        } else {
            return res.status(200).json(responseJson);
        }
    }
})
});

Как видите, он теряется, если тег еще не существует. Я играл с asyn c и жду, но я не могу заставить что-либо работать.

Обновление Мне удалось заставить его работать, хотя с дополнительной функцией. Все это выглядит как взломанный и не самый чистый подход. Я работаю, когда он закончил со счетчиком, не использующим await: /

const saveTag = function (tags, saveTagsCallback) {
async.each(tags, function (tag) {
    // Check if tag already exists
    let query = "select id from tag where label = '" + tag + "'";
    console.log(query);
    db.query(query, function (err, response) {
        if (err) {
            console.log('tag error')
        }
        if (response.length) {
            //get tagID to add the relationship
            console.log('tag  exist')
            var tagId = response[0].id;
            //callback to save link
            saveTagsCallback(tagId);
        } else {
            // Tag doesn't exist so add it into table
            console.log('tag doesnt exist')
            let tagObj = {
                label: tag,
                created: new Date(),
                modified: new Date()
            }
            let insertQuery = "INSERT INTO tag SET ?";
            console.log(insertQuery);
            console.log(tagObj);
            db.query(insertQuery, tagObj, function (err, response) {
                if (err) {
                    console.log("Errror block", err);
                } else {
                    console.log("insert success");
                    var tagId = response.insertId;
                    //callback to save link
                    saveTagsCallback(tagId);
                }
            });
        }
    });
}, function (tagId, err) {
    saveTagsCallback(tagId);
});
}

router.post('/item/add', async function (req, res, next) {

var item = {};
let responseJson = {}
let hasTags = false;
var userId = req.session.userid;

if (Array.isArray(req.body.tags)) {
    hasTags = true;
}

item.label = req.body.label;
item.url = req.body.url;
item.created = new Date();

let insertQuery = "INSERT INTO " + table + " SET ?";
await db.query(insertQuery, item, async function (err, response) {
    if (err) {
        console.log("Errror block", err);
        return res.status(500).send(getMsg("INTERNAL_SERVER_ERROR", err));
    } else {
        let itemId = response.insertId;
        responseJson.insertId = itemId;
        if (hasTags) {
            //clean up hashtags
            let new_tagsList = [];
            console.log("count==" + req.body.tags.length);
            for (let i = 0; i < req.body.tags.length; i++) {
                let tag_value = req.body.tags[i].trim();
                new_tagsList.push(tag_value);
            }
            var filteredArray = new_tagsList.filter(function (item, pos) {
                return new_tagsList.indexOf(item.toLowerCase()) == pos;
            });
            ///finish cleanup
            var insertCount = 0
            saveTag(filteredArray, function (tagId) {
                console.log(itemId);
                if (err) {
                    console.log("Errror block", err);
                    return res.status(500).send(getMsg("INTERNAL_SERVER_ERROR", err));
                } else {
                    // Add the relational link
                    var querytg = "INSERT INTO tagged (itemId, tagId, userId) VALUES ('" + itemId + "', '" + tagId + "', '" + userId + "')";
                    console.log(querytg)
                    db.query(querytg, function (err, response) {
                        if (err) {
                            console.log("Errror block", err);
                            return res.status(500).send(getMsg("INTERNAL_SERVER_ERROR", err));
                        } else {
                            insertCount++;
                            console.log('tag relationship added')
                            if (insertCount === filteredArray.length) {
                                //all tags inserted
                                responseJson = getMsg("INSERTED", null);
                                responseJson.message = responseJson.message.replace("{}", "Item");
                                responseJson.insertId = itemId;
                                return res.status(200).json(responseJson);
                            }
                        }
                    });
                }
            });
        } else {
            return res.status(200).json(responseJson);
        }
    }
})
...