React Native无法从laravel-echo-server websocket获取数据 &



注意:我已经在这个问题上一个星期了,我已经尝试了不同的解决方案,包括StackOverflow,但没有一个工作

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

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

我已经设置了websocket和redis,因为我使用redis作为广播驱动程序

一切工作良好的后端,如果一个事件被分派,我可以看到laravel的queue:work终端和laravel-echo-服务器也打印消息Event: message.createdChannel: 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 AppEvents;
use AppModelsUser;
use IlluminateBroadcastingChannel;
use IlluminateBroadcastingInteractsWithSockets;
use IlluminateBroadcastingPresenceChannel;
use IlluminateBroadcastingPrivateChannel;
use IlluminateContractsBroadcastingShouldBroadcast;
use IlluminateFoundationEventsDispatchable;
use IlluminateQueueSerializesModels;
use AppModelsMessage;
class UserChatEvent implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;
/**
* The order instance.
*
* @var AppMessage
*/

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 IlluminateBroadcastingChannel|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 configuration

'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'),
],
],

React Native End

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
.channel('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的响应,我做错了什么?或者我做错了什么,请问我已经在这个问题上一个星期了

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

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

删除消息前的点。已创建,请重试。

我终于找到了一个解决方案,这个问题是由socket引起的。如果要发布新版本,我就得降级插座。从4.x.x2.4.0

"socket.io-client": "^2.4.0",

我在这里找到了解决方案Laravel Echo Server, Redis, Socket。IO: Can't seem to make them work

最新更新