首页 > 解决方案 > 通过 Laravel 中的 Pusher 的 Web Socket - 调用 4 次

问题描述

我在我的 Laravel 项目中使用 Pusher。当我记录任何小便、便便时,它会在我的所有设备上广播这些事件:手机、笔记本电脑。

我有这个代码。

   <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
    <script type="text/javascript" src="https://momentjs.com/downloads/moment.js"></script>
    <script src="https://js.pusher.com/4.1/pusher.min.js"></script>
    <script>

    // Enable pusher logging - don't include this in production
    Pusher.logToConsole = true;

    var pusher = new Pusher('****', {
        cluster: 'us2'
    });

    var channel = pusher.subscribe('logEventChannel');
    channel.bind('logEvent', function(response) {



        var log       = response.data['json'];
        var method    = response.data['method'];

 
        console.log('\x1b[41m%s\x1b[0m',">>>>>>>>>>>>>>>>>>>>>>>>>DBEUG<<<<<<<<<<<<<<<<<<<<<<<<<");
        console.log('\x1b[41m%s\x1b[0m','method');
        console.log(method);
        console.log('\x1b[41m%s\x1b[0m',">>>>>>>>>>>>>>>>>>>>>>>>>DBEUG<<<<<<<<<<<<<<<<<<<<<<<<<");
        
                   
        console.log("SENT FROM BE", method , log);

        //====================================
        //              POST
        //====================================

        if(method == 'POST'){

            var type      = log.type;
            var id        = log.id;
            var babyId    = log.babyId;
            var updatedAt = log.updated_at;
            var timeAgo   = moment(updatedAt).fromNow();
            var time      = moment(updatedAt).format('hh:mm a');

            
            getLogMessages(type);
            getCount(type);
            shake('.badge-'+type,1);


            if(type == 'feed'){

            
                logAudit(babyId);

                blink(".timeLeft");
                blink(".nextFeed");

            }



            var row = `<tr id="tr-${id}" data-type="${type}"> <td > <a class="btn btn-${type}" > <img class="logIconSmall" src="/assets/be/img/baby/${type}.png"/> </a> </td> <td> <a onclick="showModal('${time}','${type}','${id}')" class="btn btn-link"> ${time} </a> </td> <td></td> </tr>`; 

            $('.tbody-log').prepend(row);
            blink("#tr-"+id);

        } 

        //====================================
        //              PUT
        //====================================

        if(method == 'PUT'){


            var type      = log.type;
            var id        = log.id;
            var babyId    = log.babyId;
            var updatedAt = log.updated_at;
            var timeAgo   = moment(updatedAt).fromNow();
            var time      = moment(updatedAt).format('hh:mm a');

            getLogMessages(type);
            getCount(type);
            shake('.badge-'+type,1);


            if(type == 'feed'){
            
                logAudit(babyId);
                blink(".timeLeft");
                blink(".nextFeed");
            }

            $("#tr-"+id).remove();  

            var row = `<tr id="tr-${id}" data-type="${type}"> <td > <a class="btn btn-${type}" > <img class="logIconSmall" src="/assets/be/img/baby/${type}.png"/> </a> </td> <td> <a onclick="showModal('${time}','${type}','${id}')" class="btn btn-link"> ${time} </a> </td> <td></td> </tr>`;



            $('.tbody-log').prepend(row);
            blink("#tr-"+id);


        } 

        //====================================
        //              DELETE
        //====================================

        if(method == 'DELETE'){

            var id     = log.logId;
            var type   = log.type;
            var babyId = log.babyId;


            if(type == 'feed'){
                
                logAudit(babyId);
                blink(".timeLeft");
                blink(".nextFeed");
            }

            getLogMessages(type);
            getCount(type);
            shake('.badge-'+type,1);
            blink("#tr-"+id);

            $("#tr-"+id)
            .animate({ backgroundColor: "#ef004810" }, 500 )
            .animate({ backgroundColor: "black"}, 500 )
            .fadeOut(100);
        }






        audit(babyId, id, type, method);
        getNextFeed(babyId);

    });

</script>

审计fn

function audit(babyId, logId, type, method) {

    var data    = {};
    data.babyId = babyId;
    data.logId  = logId;
    data.type   = type;
    data.method = method;
    
    console.log('SENT from FE',data);

    $.ajax({
        method: 'POST',
        url: '/baby/audit',
        crossDomain: true,
        contentType: false,
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('value'),
            "Accept": "application/json",
            "Content-Type": "application/x-www-form-urlencoded",
            "Cache-Control": "no-cache"
        },
        data: data,
        success: function(response){
            console.log('SUCCESS response',response);
        },
        error: function(jqXHR, textStatus, errorThrown) {
            console.log(JSON.stringify(jqXHR));
            console.log("AJAX error: " + textStatus + ' : ' + errorThrown);
        }
    });

}

将触发此控制器 fn

public function storeAudit()
{

    $inputs = Request::all();
    $logId  = $inputs['logId'];
    $babyId = $inputs['babyId'];
    $type   = $inputs['type'];
    $method = $inputs['method'];

    $baby   = Baby::where('id',$babyId)->first();

    if($baby){

        $log         = new BabyLogAudits;
        $log->type   = $type;
        $log->method = $method;
        $log->babyId = intval($babyId);
        $log->logId  = intval($logId);
        $log->note   = Visitor::get_client_ip();
        $log->save();

    }

    return response()->json($log,200);


}

它正在工作,但每次我都做了一些事情,我的审计功能被调用了 4 次。

结果 :

https://www.bunlongheng.com/baby/1/audit?code=rithys4k&type=all

在此处输入图像描述

一切似乎只调用了 1 次......为什么它运行了 4 次。

为什么 ??

是因为我家里有 4 台设备访问同一个链接吗?

编辑

Console.log 只显示一次。见红色横幅:

标签: phplaravelwebsocketpusherpusher-js

解决方案


推荐阅读