Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Socket.io和Redis向除发送方以外的所有客户端广播_Node.js_Laravel_Redis_Socket.io_Broadcast - Fatal编程技术网

Node.js Socket.io和Redis向除发送方以外的所有客户端广播

Node.js Socket.io和Redis向除发送方以外的所有客户端广播,node.js,laravel,redis,socket.io,broadcast,Node.js,Laravel,Redis,Socket.io,Broadcast,我在后端使用Laravel制作聊天应用程序。但是当我使用redis时,我不能使用broadcast.send功能。现在,如何将消息发送到除发件人之外的所有客户端?此代码有错误: io.broadcast.send(通道+':'+message.event,message.data) 这都是我的服务器代码: var app = require('express')(); var http = require('http').Server(app); var io = require('socket

我在后端使用Laravel制作聊天应用程序。但是当我使用
redis
时,我不能使用
broadcast.send
功能。现在,如何将消息发送到除发件人之外的所有客户端?此代码有错误:

io.broadcast.send(通道+':'+message.event,message.data)

这都是我的服务器代码:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var Redis = require('ioredis');
var redis = new Redis();


redis.subscribe('chat');

redis.on('message', function(channel, message) {
    console.log('Message Recieved: ' + message);
    message = JSON.parse(message);

    // send all client except sender
    io.broadcast.send(channel + ':' + message.event, message.data); 

});


io.sockets.on('connection', function(socket) {      
    console.log('User Connect with ID: ' + socket.id);         
});

// run server
http.listen(3001, function(){
    console.log('Listening on Port 3001');
});
和客户端代码:

var socketClient = io(':3001');
socketClient.on("chat:App\\Events\\ChatEvent", function(message){
        // increase the power everytime we load test route
        console.log(message);       
    });
ChatEvent.php

<?php

namespace App\Events;

use App\Events\Event;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class ChatEvent extends Event implements ShouldBroadcast
{
    use SerializesModels;

    public $message;

    public function __construct($value)
    {
        $this->message = $value;
    }


    public function broadcastOn()
    {
        return ['chat'];
    }
}
尝试使用通配符

class messageEvent extends Event implements ShouldBroadcast
{
    use SerializesModels;

    public $userid;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct($user)
    {

        if($user==\Auth::guard('admin')->user()->id){
                  return false;
         }
        $this->userid = $user;


    }

    /**
     * Get the channels the event should be broadcast on.
     *
     * @return array
     */
    public function broadcastOn()
    {   
        return ['ChatEvent-'.$this->userid];
    }
}
在Js中进行更改

    var socketClient = io(':3001');
    socketClient.on("chat:App\\Events\\ChatEvent-<?php echo \Auth::guard('admin')->user()->id; ?>", function(message){

            console.log(message);       
        });
var socketClient=io(':3001');
socketClient.on(“chat:App\\Events\\ChatEvent-”,函数(消息){
控制台日志(消息);
});
尝试使用通配符

class messageEvent extends Event implements ShouldBroadcast
{
    use SerializesModels;

    public $userid;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct($user)
    {

        if($user==\Auth::guard('admin')->user()->id){
                  return false;
         }
        $this->userid = $user;


    }

    /**
     * Get the channels the event should be broadcast on.
     *
     * @return array
     */
    public function broadcastOn()
    {   
        return ['ChatEvent-'.$this->userid];
    }
}
在Js中进行更改

    var socketClient = io(':3001');
    socketClient.on("chat:App\\Events\\ChatEvent-<?php echo \Auth::guard('admin')->user()->id; ?>", function(message){

            console.log(message);       
        });
var socketClient=io(':3001');
socketClient.on(“chat:App\\Events\\ChatEvent-”,函数(消息){
控制台日志(消息);
});

您可以使用附加参数扩展emit()函数,例如send_to_self=True,该参数与broadcast=True或room值一起配置是否应包括当前客户端。默认情况下,情况将保持不变,但如果将send_to_self设置为False,则迭代所有客户端以通知的循环将跳过当前连接。要检测哪一个是当前的,可以使用request.namespace,它是活动客户端的命名空间对象

所以你的代码是

io.emit(channel + ':' + message.event, message.data,send_to_self=false);

您可以使用附加参数扩展emit()函数,例如send_to_self=True,该参数与broadcast=True或房间值一起配置是否应包括当前客户端。默认情况下,情况将保持不变,但如果将send_to_self设置为False,则迭代所有客户端以通知的循环将跳过当前连接。要检测哪一个是当前的,可以使用request.namespace,它是活动客户端的命名空间对象

所以你的代码是

io.emit(channel + ':' + message.event, message.data,send_to_self=false);

您可以使用助手广播来完成此操作,然后使用方法
toOthers()


有关更多详细信息,请访问docs

您可以使用helper广播来执行此操作,然后使用方法
toOthers()


更多详情请访问docs

谢谢@ronak,但我想你不明白我的意思。我想用socket.io服务器配置将消息广播给除发送者以外的所有客户端。@Ehsan“如果($user==\Auth::guard('admin')->user()->id)”在这种情况下,发送者将触发事件,发送者将被忽略。谢谢@ronak,但我想你不明白我的意思。我想将消息广播到除具有socket.io服务器配置的发件人之外的所有客户端。@Ehsan“如果($user==\Auth::guard('admin')->user()->id)”在这种情况下,事件将与发件人一起激发,发件人将被忽略。。