node.js中函数中的嵌套SQL查询



首先,我是JS的新手。我有一个函数,可以使用多个请求来获取最终数据。我怎样才能以正确的方式做到这一点?在本例中,参与者不会被推送到对话框数组,因为它处于异步调用中。

function getDialogs(token, callback) {
//getting user id
con.query("SELECT user_id FROM users_tokens WHERE user_token = '" + token + "'", function(error, results) {
if (error) {
throw error;
}
var userId = results[0].user_id;
//getting all conversation
con.query("SELECT cc.id as conversation_id, cc.type FROM chat_conversations cc INNER JOIN chat_participants cp ON cc.id = cp.conversation_id WHERE cp.user_id = " + userId + " GROUP BY cc.id", function (error, results) {
if (error) {
throw error;
}
var dialogs = [];
for (let i = 0; i < results.length; i++) {
var dialog = {id: results[i].conversation_id};
//getting chat participants
con.query("SELECT user_id FROM chat_participants WHERE conversation_id = " + results[i].conversation_id + " AND user_id != " + userId, function (error, results) {
var participants = [];
for (let j = 0; j< results.length; j++) {
participants.push(results[j].user_id);
}
dialogs[participants] = participants;
});
dialogs.push(dialog);
}
callback(dialogs);
});
});
}

从技术上讲,您可以使用类似的单个请求

SELECT user_id FROM chat_participants WHERE conversation_id IN (
SELECT
cc.id as conversation_id,
cc.type
FROM
chat_conversations cc
INNER JOIN chat_participants cp ON cc.id = cp.conversation_id
WHERE
cp.user_id IN (
SELECT
user_id
FROM
users_tokens
WHERE
user_token = "TOKEN"
)
GROUP BY
cc.id
)

但这种方法也存在一些问题
首先,您似乎只使用了第一行的user_id,因此在这种情况下请使用LIMIT 1
其次,user_id似乎永远不会有重复,所以将其作为主键
第三,不要连接您的令牌,node-mysql支持在查询中使用?的占位符,如下所示:

con.query("SELECT * FROM ? WHERE user_id = ?", ["table_name", "userid"])

第四,承诺你的请求,这样你就不会有回调地狱,做一些类似的事情:

function promiseRequest(query, placeholders) {
return new Promise((res, rej) => {
con.query(query, placeholders, (err, data) => {
if (err) rej(err);
res(data);
});
});
}

最新更新