laravel - 带有 Laravel 的 socket.io 没有捕获连接
问题描述
这是我的客户端代码:
<script type="text/javascript">
$(document).ready(function(){
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
$("#send").click(function(){
content = $("textarea").val();
$.ajax({
url: "{{route('send.message')}}",
method: "POST",
data: {content},
success: function(){
socket.emit('message', content);
}
});
});
});
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.1.1/socket.io.js"></script>
<script>
var socket = io('http://localhost:3000');
socket.on("channel:App\\Events\\EventName", function(message){
console.log(message);
});
</script>
节点JS代码:
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('channel', function(err, count) {});
redis.on('message', function(channel, message) {
console.log('Message Recieved: ' + message);
message = JSON.parse(message);
io.on('connection', function(socket) {
console.log("made socket connection", socket.id);
});
io.emit(channel + ':' + message.event, message.data);
});
http.listen(3000, function() {
console.log('Listening on Port 3000');
});
Laravel PHP 服务器端(ajax 目标):
public function sendMessage(Request $request){
event(new EventName($request->all()));
$message = new Message;
$message->message = $request->content;
$message->save();
}
在客户端,它返回正在发送的数据,您可以在 中看到socket.on(......)
,我想做的是,一旦通过 ajax 发送消息,我想使用 发出该消息socket.emit()
,并将其捕获
io.on('connection', fuction(socket)({
});
但它不能在那里抓住它。这是为什么?我想做的是将消息广播到除我的套接字之外的其他套接字。准确地说是这样
io.broadcast.emit()
请问我怎样才能使它工作?谢谢你。
作为对@Laravelmeester 的回应,对不起,我确实设置了我的活动。但是我没有在代码中发布它。我这里有这个问题:
当我让 socket.io 像这样在 redis 回调函数中监听时:
redis.on('message', function(channel, message) {
console.log(message); //look here
socket.broadcast.emit('message', "huhu");
io.on('connection', function(socket) {
socket.on('message', function(data) {
console.log(data);
socket.broadcast.emit('message', data)
});
});
});
当我console.log(message)
输出 3-4x 时?为什么这样做?我只连接了一个客户端。所以例如我发送
测试123
,它会输出
test123
test123
test123
解决方案
您缺少很多元素,或者您可能有这些元素但未在您的问题中发布。
我想你和工匠一起做了一个活动?
php artisan make:event SendSocketMessage
之后,它应该看起来像这样,确保在构造中添加 $data var 并将其传递到 broadcastOn() 中的正确通道。
<?php
namespace App\Events;
use App\Events\Event;
use Illuminate\Support\Facades\Log;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class SendSocketMessage implements ShouldBroadcast
{
use SerializesModels;
public $data;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct($data)
{
$this->data = $data;
}
/**
* Get the channels the event should be broadcast on.
*
* @return array
*/
public function broadcastOn()
{
return ['test-channel'];
}
}
确保你的 redis 服务器正在运行并且你的 nodejs 正确设置并保持终端打开以查看结果。你看我使用了 laravel log 函数,因为你可以跟踪你的 laravel log 并测试结构和 broadcatOn 函数,看看你的数据是否来自这个事件。
现在在您触发 sendMessage 函数的控制器内部,您需要像这样包含 App\Event 和 eventname:
use Event;
use App\Events\SendSocketMessage;
然后你像这样重写你的函数:
public function sendMessage(Request $request){
Event::fire(new SendSocketMessage($request->all()));
$message = new Message;
$message->message = $request->content;
$message->save();
}
还要在前端 console.log 记录 message.data 并查看它是否正在记录。
希望这可以帮助。祝你好运!
--
请分享您在控制台日志中得到的信息,在这里您有收到的消息 + 消息参数,您的 NodeJS:
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('channel', function(err, count) {});
redis.on('message', function(channel, message) {
console.log('Message Recieved: ' + message);
message = JSON.parse(message);
io.on('connection', function(socket) {
console.log("made socket connection", socket.id);
});
io.emit(channel + ':' + message.event, message.data);
});
http.listen(3000, function() {
console.log('Listening on Port 3000');
});
那也是输出3-4倍吗?
推荐阅读
- json - Json 模式验证错误实例为真
- java - GAE 为任务队列数据存储调用获取大量 CancellationException
- sql - 快照数据库是否具有与 SQL 中的源数据库相同的即时记录?
- heroku - 有没有办法使用 --bigkeys 之类的选项运行 heroku redis-cli?
- json - 如何从 aws ec2 describe-instances 获取公共 dns 名称
- javascript - 用于匹配经纬度对列表的正则表达式
- javascript - Express.js 的路径 url 有问题,包括“?”
- python - 在没有在系统中安装 python 的情况下在 IDE 中运行 Python 代码
- javascript - 类型错误:尝试 .filter() 时“无法读取未定义的属性 'toLowerCase'”
- javascript - 使用轮子事件循环遍历数组