Я пытаюсь выполнить несколько разных запросов перед выполнением окончательного запроса, основываясь на результатах предыдущих двух. Общая идея такова:
- Вставить элемент
- Получить 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);
}
}
})