从MongoDB和xE1检索数据;nd-MySQL同步
我正在尝试从存储聊天对话的MongoDB数据库中检索数据。这工作很好,并返回我想要的。但是,我只在MongoDB中保存用户名,所以我需要从我的MySQL数据库中查询配置文件图片、用户名等。我尝试了以下方法:从MongoDB和xE1检索数据;nd-MySQL同步,mysql,node.js,mongodb,Mysql,Node.js,Mongodb,我正在尝试从存储聊天对话的MongoDB数据库中检索数据。这工作很好,并返回我想要的。但是,我只在MongoDB中保存用户名,所以我需要从我的MySQL数据库中查询配置文件图片、用户名等。我尝试了以下方法: app.get('/api/retrieveAllChats', (req, res) => { var Conversation = mongoose.model('Conversation', ConversationSchema); var ChatMessag
app.get('/api/retrieveAllChats', (req, res) => {
var Conversation = mongoose.model('Conversation', ConversationSchema);
var ChatMessage = mongoose.model('Message', ChatMessageSchema);
var userID = req.query.userID.toString()
var members = []
var conversationData = []
var retrieveAllChats = new Promise(function(resolve, reject) {
Conversation.aggregate([{ $match: { "members.uID": userID } }, { $lookup: { foreignField: "c_ID", from: "messages", localField: "_id", as: "messages" } }, { "$unwind": "$messages" }, { "$sort": { "messages.t": -1 } }, { "$group": { "_id": "$_id", "lastMessage": { "$first": "$messages" }, "allFields": { "$first": "$$ROOT" } } }, { "$replaceRoot": { "newRoot": { "$mergeObjects": [ "$allFields", { "lastMessage": "$lastMessage" } ] } } }, { "$project": { "messages": 0 } }], function (err, conversations) {
if (err) return handleError(err);
conversations.forEach((conversation, i) => {
return new Promise(function (resolveConversations, rejectConversations) {
var membersPromise = conversation.members.forEach((member, x) => {
return new Promise(function (resolveUserData, rejectUserData) {
getUserData(member["uID"], function(userData) {
members.push({userID: member["uID"], joinDate: member["j"], userName: userData["userName"], userDisplayName: userData["userDisplayName"], userVerified: userData["userVerified"], userProfilePicURL: userData["userProfilePicURL"]})
console.log("userData: ", userData)
conversations[i].members[x].userData = userData
conversationData = conversations
resolveUserData({userID: member["uID"], joinDate: member["j"], userName: userData["userName"], userDisplayName: userData["userDisplayName"], userVerified: userData["userVerified"], userProfilePicURL: userData["userProfilePicURL"]})
})
})
})
resolveConversations()
})
})
resolve()
})
}).catch(error => {
console.log(error)
res.json({ errorCode: 500 })
})
retrieveAllChats.then(function() {
res.header("Content-Type",'application/json');
res.send(JSON.stringify(conversationData, null, 4));
})
})
但是,conversationData数组始终为空。因此,我需要一种方法来解析retrieveAllChats承诺,并将我添加到现有conversations对象的数据传递给它,以返回我需要的所有信息。有什么办法可以做到这一点吗?(
getUserData
是一个检索MySQL数据的函数,这个函数可以正常工作并返回我想要的数据)您试图在forEach
内部执行异步操作,但这不起作用。您需要使用for…of
或Promise.all
此外,您还可以在运行mongoose支持的任何查询或聚合之后使用.exec()
,使此代码更加完整。这样的办法应该行得通。确保将routte行更改为该行,以告知它是一个异步函数
app.get("/api/retrieveAllChats", async (req, res) => {
核心逻辑
const conversions = await Conversation.aggregate([{"$match": {"members.uID": userID}}, {"$lookup": {"foreignField": "c_ID", "from": "messages", "localField": "_id", "as": "messages"}}, {"$unwind": "$messages"}, {"$sort": {"messages.t": -1}}, {"$group": {"_id": "$_id", "lastMessage": {"$first": "$messages"}, "allFields": {"$first": "$$ROOT"}}}, {"$replaceRoot": {"newRoot": {"$mergeObjects": ["$allFields", {"lastMessage": "$lastMessage"}]}}}, {"$project": {"messages": 0}}]);
for(const conversation of conversations) {
for(const member of conversation.members) {
// add your promise call here and either await it or use then to get the promise value.
}
}
我将如何重建我的承诺电话以适应那里?最后,我如何获得每次对话的所有结果?