Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从MongoDB和xE1检索数据;nd-MySQL同步_Mysql_Node.js_Mongodb - Fatal编程技术网

从MongoDB和xE1检索数据;nd-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

我正在尝试从存储聊天对话的MongoDB数据库中检索数据。这工作很好,并返回我想要的。但是,我只在MongoDB中保存用户名,所以我需要从我的MySQL数据库中查询配置文件图片、用户名等。我尝试了以下方法:

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.
    }
  }

我将如何重建我的承诺电话以适应那里?最后,我如何获得每次对话的所有结果?