【问题标题】:NodeJS server not receiving laravel events sent with redisNodeJS 服务器没有接收到用 redis 发送的 laravel 事件
【发布时间】:2020-07-15 10:45:36
【问题描述】:

我有一个在端口 8000 上使用 php artisan serve 运行的 laravel 应用程序,我使用 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"
  }

【问题讨论】:

    标签: node.js laravel redis


    【解决方案1】:

    首先,检查一下,您应该听一下您的 broadcastAs 函数返回的内容。

    php artisan queue:listen --queue=test
    

    否则,只会执行“默认”广播事件,并且该事件永远不会触发。

    如果你也想听“默认”:

    php artisan queue:listen --queue=test,
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-18
      • 1970-01-01
      • 2019-03-17
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 2014-05-04
      相关资源
      最近更新 更多