【问题标题】:React Native not getting data from laravel-echo-server websocketReact Native 没有从 laravel-echo-server websocket 获取数据
【发布时间】:2023-01-12 04:53:52
【问题描述】:

笔记:我在这个问题上已经有一个星期了,我在网上尝试了不同的解决方案,包括 StackOverflow,但都没有用

我有一个在 React Native Expo 中构建的应用程序,我正在向该应用程序添加聊天功能,我使用 Laravel 构建了该应用程序的 API。

我现在正在为聊天设置 websocket,我在 React Native 应用程序(客户端)和后端(Laravel 端)上安装了 Laravel Echo 和 socket.io 我正在使用 laravel-echo-server 和 laravel 广播

我已经设置了 websocket 和 redis,因为我使用 redis 作为广播服务器

一切都在后端运行良好,如果发送了一个事件,我可以在 laravel queue:work 终端上看到并且 laravel-echo-server 也打印消息 Event: message.created Channel: chats1

这些是我的后端代码

.env文件中的Redis配置

BROADCAST_DRIVER=redis
QUEUE_CONNECTION=redis

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=port_number
REDIS_CLIENT=predis

事件类

<?php

namespace App\Events;

use App\Models\User;
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;
use App\Models\Message;

class UserChatEvent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;
    /**
     * The order instance.
     *
     * @var \App\Message
     */
    
    public $message;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct(Message $message)
    {
        $this->message = $message;
    }
    
    
    public function broadcastAs()
    {
        return 'message.created';
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new Channel("chats1");
    }
}

laravel-echo-server.json

{
    "authHost": "https://my_domain.com",
    "authEndpoint": "/broadcasting/auth",
    "clients": [],
    "database": "redis",
    "databaseConfig": {
        "redis": {
            
        },
        "sqlite": {
            "databasePath": "/database/laravel-echo-server.sqlite"
        }
    },
    "devMode": true,
    "host": null,
    "port": "6001",
    "protocol": "http",
    "socketio": {},
    "secureOptions": secret_number,
    "sslCertPath": "",
    "sslKeyPath": "",
    "sslCertChainPath": "",
    "sslPassphrase": "",
    "subscribers": {
        "http": true,
        "redis": true
    },
    "apiOriginAllow": {
        "allowCors": true,
        "allowOrigin": "*",
        "allowMethods": "*",
        "allowHeaders": "*"
    }
}

database.php redis配置

'redis' => [

        'client' => env('REDIS_CLIENT', 'phpredis'),

        'options' => [
            'cluster' => env('REDIS_CLUSTER', 'redis'),
            'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
        ],

        'default' => [
            'url' => env('REDIS_URL'),
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'username' => env('REDIS_USERNAME'),
            'password' => env('REDIS_PASSWORD'),
            'port' => env('REDIS_PORT', '6379'),
            'database' => env('REDIS_DB', '0'),
        ],

        'cache' => [
            'url' => env('REDIS_URL'),
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'username' => env('REDIS_USERNAME'),
            'password' => env('REDIS_PASSWORD'),
            'port' => env('REDIS_PORT', 'port'),
            'database' => env('REDIS_CACHE_DB', '1'),
        ],

    ],

反应本机结束

import Echo from 'laravel-echo';
import socketio from 'socket.io-client';
...

const echo = new Echo({
            host: 'ws://my_domain.com:6001',
            broadcaster: 'socket.io',
            client: socketio,
            
        
        });
        
        echo
        .private('chats1')  
        .listen('.message.created', (ev: any) => {
            Alert.alert('Socket Msg', 'Got data success')
            console.log('socket msg:', JSON.stringify(ev))
        }).error((er: any) => {
            Alert.alert('Socket Err', 'An error occured')
            console.log('socket error msg:', JSON.stringify(er))        
        });

laravel-echo-server 的响应没有在控制台中记录任何内容,我做错了什么?或者我做错了什么,我已经在这个问题上解决了一个星期了

【问题讨论】:

    标签: laravel react-native redis laravel-echo


    【解决方案1】:

    你打错了。这部分代码应该是:

       .listen('message.created', (ev: any) => {
            Alert.alert('Socket Msg', 'Got data success')
            console.log('socket msg:', JSON.stringify(ev))
        })
    

    删除 message.created 之前的点,然后重试。

    【讨论】:

    • 谢谢你的回复,我试过了,还是一样的,.(点)是告诉 laravel echo消息.created不是命名空间
    猜你喜欢
    • 2020-06-11
    • 1970-01-01
    • 2021-03-17
    • 2020-02-18
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 2023-03-18
    相关资源
    最近更新 更多