node.js - NodeJS 服务器没有接收到用 redis 发送的 laravel 事件
问题描述
我在端口 8000 上运行了一个 laravel 应用程序php artisan serve
,我监听队列php artisan queue:listen
以监听应用程序广播的事件。我还在端口 6379 上运行了一个 redis 服务器,但是当我使用 广播消息时event(new TestEvent())
,NodeJS 服务器看不到该消息。我尝试了 2 个不同的节点变体,变体 1 不记录单个消息,但变体 2 没有事件启动。错误信息:
[ioredis] Unhandled error event: Error: getaddrinfo ENOTFOUND redis redis:6379
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:56:26)
Laravel .env:
BROADCAST_DRIVER=redis
CACHE_DRIVER=file
SESSION_DRIVER=file
SESSION_LIFETIME=120
QUEUE_DRIVER=database
REDIS_HOST=redis
REDIS_PASSWORD=null
REDIS_PORT=6379
测试事件:
class TestEvent implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;
private $message = 'hello';
/**
* Create a new event instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Get the channels the event should broadcast on.
*
* @return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
return ['home'];
}
public function broadcastAs()
{
return 'test';
}
}
节点服务器变体 1:
const express = require('express');
const app = express();
const http = require('http');
const server = http.Server(app);
const socketIO = require('socket.io');
const io = socketIO(server);
const redis = require('redis');
const port = 3000;
io.on('connection' , (socket) => {
console.log('user connected');
socket.on('test1', (message) => {
console.log(message);
});
});
const redisClient = redis.createClient();
redisClient.subscribe('test');
redisClient.subscribe('*');
redisClient.on('*', function(channel, message) {
console.log(channel);
console.log(message);
});
redisClient.on('message', function(channel, message) {
console.log(channel);
console.log(message);
// socket.emit(channel, message);
});
redisClient.on('test', function(channel, message) {
console.log(channel);
console.log(message);
// socket.emit(channel, message);
});
server.listen(port, () => {
console.log('started on port: ' + port);
});
节点变体 2:
var app = require('http').createServer(handler);
var io = require('socket.io')(app);
var Redis = require('ioredis');
var redis = new Redis(6379, 'redis');
app.listen(3000, function() {
console.log('Server is running!');
});
function handler(req, res) {
res.writeHead(200);
res.end('');
}
io.on('connection', function(socket) {
//
});
redis.psubscribe('*', function(err, count) {
//
});
redis.on('pmessage', function(subscribed, channel, message) {
message = JSON.parse(message);
io.emit(channel + ':' + message.event, message.data);
});
包.json
"dependencies": {
"@types/socket.io": "^2.1.4",
"express": "^4.17.1",
"redis": "^3.0.2",
"socket.io": "^2.3.0",
"ioredis": "^2.4.0"
}
解决方案
首先,只是为了检查,您应该听一下您的 broadcastAs 函数返回的内容。
php artisan queue:listen --queue=test
否则,只会执行“默认”广播事件,并且该事件永远不会触发。
如果你也想听“默认”:
php artisan queue:listen --queue=test,
推荐阅读
- python - 如何将字符串转换为类名?
- php - 使用 VueJS 的 CakePHP 3 安全组件和表单字段
- android - 将位图转换为 WebRTC VideoFrame
- amazon-web-services - 是否可以像在 AWS WAF 中那样在 Azure 中制定规则?
- protractor - 有没有办法自动运行 Protractor e2e 测试?
- .net - 如何在不失去迭代器优点的情况下重载迭代器函数
- android - 添加授权头接口android改造
- angular - 当控制器持有 Observable(Angular 6)时,如何将数据发送到 API 以更新对象
- visual-studio - 无法启动 MVC 项目(无法连接)
- javascript - 在 JavaScript 中使用 match() 或 find() 匹配 JSON 数组中的某个值