【发布时间】: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