Не работает связка Laravel + Redis + NodeJS + socket.io ioredis
Вроде всё должно работать, но почему то на node.js redis.on("message",..... не отрабатывает и даже в серверную консоль не пишет console.log(). Помогите разобраться.
Использую Homestead
.env
BROADCAST_DRIVER=redis
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
node.js успешно запускает сервер (пробовал и встроенный http, и express) - server.js
var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
const Redis = require('ioredis');
const redis = new Redis();
redis.subscribe("news-action", function () {
console.log('redis subscribe');
});
io.on('connection', function (socket) {
console.log('a user connected');
});
io.on('disconnect', function () {
console.log('user disconnected');
});
console.log("Status Redis:" + redis.status);
redis.on("message", function (channel, message) {
console.log('Message received: ' + message);
console.log('Channel: ' + channel);
message = JSON.parse(message);
io.emit(channel + ':' + message.event, message.data);
});
server.listen(3000, function () {
console.log('Listening on Port: 3000');
})
Событие Laravel (имплементирует ShouldBroadcast) записывает данные в redis (redis-cli monitor это подтверждает):
vagrant@homestead:~$ redis-cli monitor
OK
1588773228.776438 [0 127.0.0.1:45916] "SELECT" "0"
1588773228.776597 [0 127.0.0.1:45916] "EVAL" "for i = 2, #ARGV do\n redis.call('publish', ARGV[i], ARGV[1])\nend" "0" "{\"event\":\"App\\\\Events\\\\NewMessage\",\"data\":{\"message\":\"test message\",\"socket\":null},\"socket\":null}" "laravel_database_news-action"
1588773228.776627 [0 lua] "publish" "laravel_database_news-action" "{\"event\":\"App\\\\Events\\\\NewMessage\",\"data\":{\"message\":\"test message\",\"socket\":null},\"socket\":null}"
redis слушает нужный канал:
vagrant@homestead:~$ redis-cli PUBSUB CHANNELS
1) "news-action"
На клиенте подключена библиотека socket.io-client
Вот компонент Vue:
<template>
<div class="container">
<div class="row">
<div class="col-sm-12">
<div class="from-group">
<textarea rows="6" readonly class="form-control">{{ dataMessages.join('\n') }}</textarea>
<div class="input-group mb-3">
<input type="text" class="form-control" placeholder="Наберите сообщение" v-model="message">
<div class="input-group-append">
<button @click="sendMessage" class="btn btn-outline-secondary" type="button">Отправить</button>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
data: function() {
return {
dataMessages: [],
message: "",
}
},
mounted() {
var socket = io('http://a-7w.local:3000');
socket.on('connect', function () {
console.log('connected!');
});
socket.on("news-action:App\\Events\\NewMessage", function (data) {
this.dataMessages.push(data.message);
console.log("data result: " + data.message)
}.bind(this));
},
methods: {
sendMessage: function () {
axios({
method: 'get',
url: '/vue-learn/send-message',//контроллер Laravel запускает event так - event(new NewEvent($result));
params: {
message: this.message,
}
}).then((response) => {
this.message = "";
});
}
}
}
</script>