当前位置: 首页 > 知识库问答 >
问题:

laravel-echo-server和socket.io在home的获得TypeError:无法读取属性'门位ID'和'存在通道'

江瀚昂
2023-03-14

我试图创建一个实时聊天应用程序与laravel 5.4, laravel-echo, redis和套接字io的家园。

请检查下面的代码,然后检查我的问题

聊天对话事件:

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

    public $message;

    public $user;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct(Chat $message, User $user)
    {
        $this->message = message;
        //Người gửi
        $this->user = $user
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return Channel|array
     */
    public function broadcastOn()
    {
        return new PresenceChannel('chatroom');
    }
}

我的网络。php:

Route::post('/privatechat/{id}/{receiver_id}', function(){
        $user = Auth::user();
        $room_id = request()->segment(5);
        $rec = request()->segment(6);

        $message = Chat::create([
            'chat_room'     =>  $room_id,
            'message'       =>  request()->get('message'),
            'sender_id'     =>  $user->id,
            'receiver_id'   =>  $rec
        ]);

        broadcast(new ChatConversation($message, $user));

        return ['status' => 'OK'];
    })->middleware('auth');

我的聊天室vue设置:

const app = new Vue({
                el: '#app',
                data: {
                    messages: [],
                    sendClass: 'chat-send'
                    //Điều kiện
                },
                methods: {
                    addMessage(message) {
                        this.messages.push(message);

                        axios.post(url_post, message);
                        /*.then(function (response) {
                            //swal('Tuyệt vời! Work like a charm!');
                            console.log(response);
                        })
                        .catch(function (error) {
                            console.log(error);
                        });*/
                    }
                },
                created() {
                    var u = url;
                    axios.get(u).then(response => {
                        //console.log(response);
                        this.messages = response.data;
                    });

                    /*Echo.join('chatroom')
                    .here()
                    .joining()
                    .leaving()
                    .listen('ChatConversation', (e) => {
                        console.log(e);
                    })*/

                    Echo.join('chatroom')
                        .listen('ChatConversation', (e) => {
                            console.log(e);
                        })
                }
            });

我的bootstrap.js

import Echo from "laravel-echo"

window.Echo = new Echo({
    broadcaster:  '../socket.io-client/dist/socket.io',
    host: window.location.hostname + ':6001'
});

我的laravel-echo-server.json

"devMode": true,
"host": null,
"port": "6001",
"protocol": "http",
"socketio": {},
"sslCertPath": "",
"sslKeyPath": ""

>

  • 我的第一个问题是当我使用此脚本访问客户端库时:

    src=“//{Request::getHost()}}}:6001/socket.io/socket.io.js

    我得到了这个错误http://hgc.develop:6001/socket.io/socket.io.js 错误连接被拒绝,所以我不得不从bower下载socket并将上面的线路改为

    <script src="{{ asset('js/socket.io-client/dist/socket.io.js') }}"></script>
    

    我的第二个问题是,当我进入聊天应用程序页面时,控制台会显示以下错误:

    app.js:35246类型错误:无法读取未定义的属性存在通道

    应用程序。js:15520未捕获(promise中)TypeError:无法读取未定义的属性“socketId”

    另外,我按照本教程创建聊天应用程序:https://www.youtube.com/watch?v=8aTfMHg3V1Q 但我使用Redis和Socket。用io代替Pusher

    我的代码出了什么问题?我该如何处理这些问题?

  • 共有1个答案

    耿联
    2023-03-14

    我终于设法弄明白了。我看了JS文件,并设法把它归结为这样一个事实,即这一行中的代码具有尝试捕获部分,如果Laravelchannels.php检查谁可以收听一个频道,则实际上不会抛出错误返回一个用户模型实例。

    像这样的Channels.php会抛出错误:

    Broadcast::channel('users', function ($user) {
        if($user->type == 'admin'){
             return $user;
        }else{
             return false;
        }
    });
    

    如果$user没有通过if检查Laravel将返回false。因为它没有返回JSON,而且只是false,所以我认为它应该记录响应主体没有传递JSON. parse()函数,这样您就可以在终端中看到它。像这样的东西:

    try {
         body = JSON.parse(response.body);
    } catch (e) {
         Log.warning('Response body provided is not expected JSON. Response body provided ${response.body}');
         body = response.body;
    }
    

    通过这种方式,我们可以看到Laravel是否没有返回用户模型实例。

    因此,当您没有按预期获得用户模型实例时,代码就没有用户对象可附加sockedId,因为它是未定义的。从来没有任何JSON可以用来创建对象。

    我认为,如果您也没有获得用户实例,那么代码应该停止尝试连接到状态或专用通道,而不是尝试附加套接字ID。

    无论如何,要实际返回用户,请确保您使用Laravel的Auth系统登录。如果你没有使用它,你可能需要做一些工作来让它工作。如果你不使用它,那么Laravel中的这个函数会抛出一个403错误,因为它找不到你要登录。

    我不得不将检查密码散列算法的函数重写为一个自定义算法,这样我就不会弄乱Laravel核心,并使用户模型扩展Laravel正在寻找的类。

    然后在你的频道。php文件只需确保所做的检查实际上是从auth check广播机返回回调函数中的$user。php文件没有。大概是这样的:

    Broadcast::channel('users', function ($user) {
         return $user;
    });
    

    这是一个超级简单的私人/状态通道,但如果用户登录并返回$user,则不会抛出此错误。

    另外,请确保在Echo实例中调用socket.io如下所示:

    window.Echo = new Echo({
        broadcaster:  'socket.io',
        host: window.location.hostname + ':6001'
    });
    
     类似资料:
    • 我在一个简单的post请求中收到错误“TypeError:无法读取未定义的属性'\u id',该请求将文档保存到名为的集合中,我的有效负载如下所示: 我只是在做

    • 我收到以下JavaScript错误: TypeError:无法读取null的属性“title” 代码如下: mds-iMac: cmscart imac$nodemo app[nodemo] 1.11.0[nodemo]随时重启,输入[nodemo]观看:.[nodemo]启动(node: 2274)DeprecationWarning:在猫鼬中被弃用 [nodemon]应用程序崩溃-正在等待文件

    • 问题内容: 我是ReactJS的新手,遇到一些问题。 我还了解了语法,它说以下代码具有相同的含义。 1。 2。 但是,第一种方法引发此错误 问题答案: YTSearch({key: API_KEY, term: ‘nba’}, function(videos) { this.setState({ videos }); }); 引发错误,因为在此回调内部并未引用函数本身的上下文,因此此处未定义。 在

    • 我是一个初学者,学习反应和还原。我写了这个关于如何在Redux中使用Connect.js的演示。搜索这类问题,但我的代码没有正确的答案。我得到了一个未定义的上下文。是错字吗?还是我以错误的方式传递了上下文?提前谢了。这是我的代码。 index.js /store/index.js Constants.js

    • 我试图创建一个post方法,以便将数据存储到mongoDb中,但是当我通过postman发送post请求时,出现了一个类型错误 我已经通过npm更新了软件包,但错误保持不变 类型错误:无法读取属性'Customer_id'的未定义在exports.create_customer(C:\用户\jawad\桌面\nodejspactise\控制器\admin.controll.js:64: 31)在L