Laravel Echo Listener not working on frontend

All we need is an easy explanation of the problem, so here it is.

I have created an event:

<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class QueueStatus implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;


    public $queue;

    public function __construct()
    {
        $queue = 'test2';
    }


    public function broadcastOn()
    {
        return new Channel('thechannel');
    }
    public function broadcastWith()
    {
        return ['test1'];
    }
    public function broadcastAs() {
        return 'examplee';
    }
}

Here is the bootstrap.js:

import Echo from "laravel-echo"

window.io = require('socket.io-client');

window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: window.location.hostname + ':6001'
});
window.Echo.channel('thechannel')
    .listen('.examplee', (e) => {
        console.log(e);
    });

and the route:

Route::get('/', function () {
    event(new \App\Events\QueueStatus());
    return view('welcome');
});

laravel-echo-server.json :

{
    "authHost": "http://localhost",
    "authEndpoint": "/broadcasting/auth",
    "clients": [
        {
            "appId": "2583d37858d083b7",
            "key": "248536aa1290916b4cd80279fe8fa4cf"
        }
    ],
    "database": "redis",
    "databaseConfig": {
        "redis": {},
        "sqlite": {
            "databasePath": "/database/laravel-echo-server.sqlite"
        }
    },
    "devMode": true,
    "host": null,
    "port": "6001",
    "protocol": "http",
    "socketio": {},
    "secureOptions": 67108864,
    "sslCertPath": "",
    "sslKeyPath": "",
    "sslCertChainPath": "",
    "sslPassphrase": "",
    "subscribers": {
        "http": true,
        "redis": true
    },
    "apiOriginAllow": {
        "allowCors": true,
        "allowOrigin": "http://localhost:8000",
        "allowMethods": "GET",
        "allowHeaders": "Origin, Content-Type, X-Auth-Token, X-Requested-With, Accept, Authorization, X-CSRF-TOKEN, X-Socket-Id"
    }
}

ENV file:

APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:tDyjOGMQ5AhlIdieUGZnhTi3IcJ7+vx4m8H6rDi9idI=
APP_DEBUG=true
APP_URL=http://localhost

LOG_CHANNEL=stack
LOG_LEVEL=debug

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=assets_daily_info
DB_USERNAME=root
DB_PASSWORD=

BROADCAST_DRIVER=redis
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

When I set the broadcast driver to log:

[2020-11-26 16:19:52] local.INFO: Broadcasting [QueueStatuss] on channels [thechannel] with payload:
{
    "0": "test1",
    "socket": null
}  

When I set the broadcast driver to redis & monitor redis via CLI:

1606408782.818033 [0 127.0.0.1:11665] "EVAL" "for i = 2, #ARGV do\n  redis.call('publish', ARGV[i], ARGV[1])\nend" "0" "{\"event\":\"examplee\",\"data\":{\"0\":\"test1\",\"socket\":null},\"socket\":null}" "thechannel"
1606408782.818162 [0 lua] "publish" "thechannel" "{\"event\":\"examplee\",\"data\":{\"0\":\"test1\",\"socket\":null},\"socket\":null}"

It looks like everything works fine, but the browser console in frontend doesn’t show any logs.
What’s the problem? Why can’t I get the listener to work on frontend?

I tried changing the broadcastAs, and also putting a dot before the name in the frontend.
But still no luck.

How to solve :

I know you bored from this bug, So we are here to help you! Take a deep breath and look at the explanation of your problem. We have many solutions to this problem, But we recommend you to use the first method because it is tested & true method that will 100% work for you.

Method 1

It so strange, however, I fixed it by downgrading the socket.io-client from 3.0.3 to 2.3.0

Note: Use and implement method 1 because this method fully tested our system.
Thank you 🙂

All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply