javascript - Node.js 为相关查询提供空数组

标签 javascript mysql arrays node.js ionic-framework

我有一个 PHP 网站,其中聊天模块工作正常(通过 ajax)。 现在我正在为此聊天模块创建 Ionic 应用程序,因此我尝试在 NODE.js 上转换我的 PHP 代码

为了获取聊天用户列表,我在 helper.js 文件中编写了此代码

setMessage:function(message1){
    message=message1;
},
setPeople:function(id,people1){
    people[id]=people1;
},
setChatlist:function(data9){
    chatlist.push(data9);
},

setRecorder:function(data8){
    recorder.push(data8);
},

getUserChatList:function(uid,connection,callback){
    chatlist=[];
    recorder=[];
    people=[];
    message={};     
    var data={
        query:"select id from messages where recipient_id='"+uid+"' or  timeline_id='"+uid+"' order by timestamp desc ",
        connection:connection
    }

    var db_conncetion=data.connection;
    var query=data.query;
    var insert_data=data.insert_data;

    db_conncetion.getConnection(function(err,con){
        if(err){
          con.release();
        }else{
            con.query(String(query),insert_data,function(err,rows){

            if(!err) {
            if(rows.length>0){
                query1="select DISTINCT recipient_id from messages where timeline_id='"+uid+"' order by timestamp desc ";
                con.query(String(query1),insert_data,function(err1,rows1){
                        rows1.forEach(function(element1, index1, array1){       
                            var receiverId=element1.recipient_id;
                            var receiverSql = "SELECT time,text FROM messages WHERE timeline_id=" +uid+ " AND recipient_id="  +receiverId+" ORDER BY time DESC";                        
                            con.query(String(receiverSql),insert_data,function(err2,rows2){
                                rows2.forEach(function(element2, index2, array2){
                                    people[receiverId]=element2.time;
                                    message[receiverId]=element2.text;
                                });
                                self.setMessage(message);
                                self.setPeople(people,people);
                            });
                        });
                    });
                            var senderIdSql = "SELECT DISTINCT timeline_id FROM messages WHERE recipient_id=" +uid+ " ORDER BY time DESC";                              
                con.query(String(senderIdSql),insert_data,function(err3,rows3){
                        rows3.forEach(function(element1, index1, array1){       
                                var senderId=element1.timeline_id;
                                var senderSql = "SELECT time,text FROM messages WHERE recipient_id=" +uid+  " AND timeline_id=" +senderId+ " ORDER BY time DESC";
                                con.query(String(senderSql),insert_data,function(err2,rows2){
                                    rows2.forEach(function(element2, index2, array2){
                                        if (!self.isset(people[senderId]) || element2.time > people[senderId])
                                        people[senderId]=element2.time;
                                        message[senderId]=element2.text;
                                    self.setPeople(senderId,element2.time); 
                                    self.setMessage(message);
                                }); 
                                });
                            });
                    });

                }   
                Object.keys(people).forEach(function (key){
                 var tempArray={};
                 tempArray['id']=key;
                 tempArray['text']=message[key];
                self.setRecorder(tempArray);
                });

        recorder.forEach(function (key){
            var user_query="SELECT * FROM  accounts WHERE id=" +key +" AND active=1 ";
                con.query(String(user_query),insert_data,function(err3,rows3){
                    var tmp1=[];
                    rows3.forEach(function(element2, index2, array2){
                        var data1={};
                        data1['receiver_id']=element2.id;
                        data1['receiver_username']=element2.username;
                        data1['receiver_name']=element2.name;
                        data1['receiver_thumbnail_url']=element2.thumbnail_url;
                        data1['receiver_online']=0;
                            data1['receiver_message'] = recorder[key];
                        tmp1.push(data1);

                    });
                self.setChatlist(tmp1);     
                });                             

        });
                var ret_data={};
                ret_data['status']=200;
                ret_data['success']=1;
                ret_data['messages']=chatlist;
                console.log(ret_data);
                console.log("1111");
                callback(ret_data);
                con.release();
            //console.log(message);

            } else {
              console.log(err);  
              console.log("Query failed");  
            }        
          });
        }
    });

 }

但是当我通过套接字调用此方法时,它给出一个空数组

正在收听http://localhost:3000 { 状态:200,成功:1,消息:[] } 第1111章

请告诉我为什么它给出一个空数组?

最佳答案

根据您当前的代码,它应该是一个空数组。

所有数据库调用都将是异步的,并且不会等待其完成。它将执行下一行,该行将在数据库调用完成之前执行以下代码:

 var ret_data = {};
      ret_data['status'] = 200;
      ret_data['success'] = 1;
      ret_data['messages'] = chatlist;
      console.log(ret_data);
      console.log("1111");
      callback(ret_data);
      con.release();
      //console.log(message);

因此,您的回调将以 [] 的初始值执行,因此您的值为 []

您必须管理数据库调用和要发送的数据。您可以使用 Promise 或 async/await 来实现这一点。代码将更加干净和可追溯。仔细看看它们。

关于javascript - Node.js 为相关查询提供空数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47483367/

相关文章:

ios - 用函数修改多张图片

javascript - 需要在 Protractor 中播放本地 MP3 文件

javascript - 根据源 ID 更改 onkeypress 事件的函数参数

javascript - 删除 php 数组中的空值

mysql - 如何从服务器上的 "java.sql.ResultSet"获取客户端上的数据源文件?

javascript - 如何使用 Javascript 中另一个数组的值更改数组中的特定非零值

python - 使用 bool 数组在 DataFrame(或 ndarray)中有效设置一维范围值

javascript - 如果尚未可用,则在 jQuery 加载时执行

MySQL 用户定义函数 - SQL 语法错误

mysql - 减去两列并在运行时对结果求和