Отправлять события от Node Client на сервер Laravel Echo

Я пытаюсь отправить некоторые события от Node Client на эхо-сервер Laravel.

В Интернете не так много документации. Я пытался сделать это с помощью socket.emit(), но на эхо-сервер не приходит никаких событий.

Вот мой код app.ts

import express = require('express');
import Echo from "laravel-echo";
import SocketIoClient from "laravel-echo";


// Create a new express application instance
const app: express.Application = express();
let io = require('socket.io-client');

let echo = new Echo({
  broadcaster: 'socket.io',
  host: 'http://3.16.169.253:6001',
  client: io
});


echo.channel('public').listen('drumdata', (e:any) => {
  console.log("DATA RECEIVED");
  console.log(e);
})

sendData();

async function sendData(){
for(let i=0;i<10;i++){
  await sleep(2000) 
  echo.connector.options.auth.headers['X-Socket-ID'] = echo.connector.socket.id
  echo.connector.socket.emit('drumdata', "public",{"eventData":"myData"}) ;

 }
}




function sleep(ms:number) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

Журнал Echo-Server показывает, что приложение присоединяется к каналу, но никаких событий не запускается.

[3:25:25 PM] - S6s3SKH1L61C9U6NAAAr joined channel: public
[3:25:59 PM] - S6s3SKH1L61C9U6NAAAr left channel: public (transport close)
[3:26:08 PM] - qZljcx9BzDZOU-s8AAAs joined channel: public
[3:26:14 PM] - qZljcx9BzDZOU-s8AAAs left channel: public (transport close)
[3:27:02 PM] - 9--wTFOpWlZVIfw4AAAt joined channel: public

Есть ли у кого-нибудь предложения по этому поводу?

РЕДАКТИРОВАТЬ:

Запуск laravel-echo-server в режиме DEBUG показывает, что сообщение получено, но на канал не отправлено событие. Я даже добавил заголовок аутентификации «X-Socket-ID».

2019-07-09T10:09:10.381Z socket.io:socket got packet {"type":2,"nsp":"/","data":["drumdata","public",{"eventData":"pincia"}]}
2019-07-09T10:09:10.381Z socket.io:socket emitting event ["drumdata","public",{"eventData":"pincia"}]
2019-07-09T10:09:10.381Z socket.io:socket dispatching an event ["drumdata","public",{"eventData":"pincia"}]
2019-07-09T10:09:12.350Z engine:ws received "42["drumdata","public",{"eventData":"pincia"}]"
2019-07-09T10:09:12.350Z engine:socket packet
2019-07-09T10:09:12.350Z socket.io-parser decoded 2["drumdata","public",{"eventData":"pincia"}] as {"type":2,"nsp":"/","data":["drumdata","public",{"eventData":"pincia"}]}
2019-07-09T10:09:12.350Z socket.io:socket got packet {"type":2,"nsp":"/","data":["drumdata","public",{"eventData":"pincia"}]}
2019-07-09T10:09:12.350Z socket.io:socket emitting event ["drumdata","public",{"eventData":"pincia"}]
2019-07-09T10:09:12.350Z socket.io:socket dispatching an event ["drumdata","public",{"eventData":"pincia"}]
2019-07-09T10:09:14.350Z engine:ws received "42["drumdata","public",{"eventData":"pincia"}]"
2019-07-09T10:09:14.350Z engine:socket packet

Спасибо, Федерико


person Federico Pinciaroli    schedule 08.07.2019    source источник
comment
похоже, вам нужно только активировать функцию события? laravel.com/docs/5.8/broadcasting # трансляции-события   -  person 4m1r    schedule 08.07.2019
comment
Мое намерение состояло в том, чтобы отправить событие из узла, а не формировать laravel ...   -  person Federico Pinciaroli    schedule 09.07.2019
comment
Итак, если вы собираетесь излучать из процесса узла, вам понадобится EventEmitter, и вам нужно будет прикрепить функцию к событию, которое уведомляет канал. Вы даже можете передавать данные от эмиттера к каналу, поскольку они оба являются потоками событий. nodejs.org/api/events.html#events_events   -  person 4m1r    schedule 09.07.2019
comment
вы можете использовать http api laravel-echo-server для генерации событий: docs https://github.com/tlaverdure/laravel-echo-server#http   -  person Roland Starke    schedule 09.07.2019
comment
столкнувшись с той же проблемой   -  person Ashok Devatwal    schedule 07.05.2020


Ответы (1)


Итак, я начинаю понимать, как все это работает, документация не очень полезна, но похоже, что эхо-сервер использует http api для отправки сообщений. В таком случае, похоже, они рекомендуют аксиомы. Это решение должно работать, но я не могу понять, каким должен быть путь к каналу. Как только вы это выясните, вы должны увидеть, как ваше событие распространяется с сервера узла. На данный момент это всего лишь 404с.

const express = require('express');
const Echo = require('laravel-echo');
const io = require('socket.io-client');
const axios = require('axios');

// Create a new express application instance
const app = express();

const echo = new Echo({
  broadcaster: 'socket.io',
  host: 'http://127.0.0.1:6001',
  client: io
});


echo.channel('public').listen('drumdata', (e) => {
  console.log("DATA RECEIVED");
  console.log(e);
})


async function sendData(){
for(let i=0;i<10;i++){
  await sleep(2000);
  console.log('echoing'); // echo.socketId() is already set on X-Socket-Id thanks to Axios
  axios.post('http://127.0.0.1:6001/public/drumdata', {"eventData":"myData"})
    .then((response) => {
        console.log(response);
    });

 }
}

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

sendData();
person 4m1r    schedule 09.07.2019