【问题标题】:Node.js giving empty array for dependent queriesNode.js 为相关查询提供空数组
【发布时间】:2018-05-09 01:33:00
【问题描述】:

我有一个 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

请说明为什么它给出了一个空数组?

【问题讨论】:

    标签: javascript mysql arrays node.js ionic-framework


    【解决方案1】:

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

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

     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);
    

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

    您必须管理数据库调用和要发送的数据。您可以对此使用 promises 或 async/await。代码将更加干净和可追溯。好好看看他们。

    【讨论】:

    • 但我也在使用 self.setPeople 和 self.setMessage 进行回调
    • 但是回调函数会在 self.setPeople 和 self.setMessage 函数被调用之前被执行。
    • 我正在尝试使用 Async/Await,如示例 npmjs.com/package/mssql#asyncawait 中所示,但它不起作用。你能帮帮我吗?
    猜你喜欢
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    相关资源
    最近更新 更多