Socket IO Broadcast от api / router, когда выполняется Heroku Scheduler - Как? - PullRequest
0 голосов
/ 17 октября 2018

Я хотел бы транслировать или передавать всем клиентам, подключенным через SocketIO, всякий раз, когда выполняется задание Haroku Scheduler.Я настроил планировщик Heroku, который выполняется каждые 10 минут. Он выполняет запрос get, который находится в модуле, называемом роутер.Цель - делать обновления для клиента каждые 10 мин.Я пробовал с вещанием и излучением, но я довольно новичок в этой игре.

Я что-то упустил - возможно, SocketIO нужен клиентский запрос, а не задание планировщика heroku, или мои настройки сервера каким-то образомсломана.В любом случае это не сработает.Требуется помощь.

Мой маршрутизатор

const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');

const app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);

const api = require('./routes/api');
const PORT = [3000, process.env.PORT];

app.use(cors());

app.use(express.urlencoded({
    extended: true
  }));

app.use(express.json());

//Middleware that attach io to req so that I can use it in router.
app.use(function (req, res, next) {
    req.io = io;
    next();
})

app.use('/api', api);

server.listen(PORT[1], function(){
    console.log("app listen on localhost port something" )
});

Мой маршрутизатор (который выполняется каждые 10 минут).

router.get('/event/emitEventUpdates', (req, res)=>{
    //Every 10 min. the events on client must be updated
    console.log("i server emitEventUpdates");
    req.io.on('connection', function (socket) {
        socket.emit('message', {type:'new-message', text: "message from server"});
server"});
        res.send({message : "all done from API"})
    })
})

Мой клиент - приложение Angular 6, котороеделает соединение.Observable выглядит следующим образом:

let observable = new Observable(observer => {
    this.socket.on('message', (data) => {
      console.log("Received message from Websocket Server")
    })
    return () => {
      this.socket.disconnect();
    }
});

Я бы предположил, что всякий раз, когда наблюдаемая активна, консоль должна что-то записывать в консоль.Я могу добавить дополнительную информацию об этом, если необходимо, но я думаю, что проблема на стороне сервера ..

1 Ответ

0 голосов
/ 17 октября 2018

Это может быть длинный ответ, так как я постараюсь многое рассказатьПрокомментируйте столько, сколько можете, если это не так, или если вы отслеживаете пользовательские состояния, я могу отредактировать ответ и помочь вам.

Javascript - это язык, который дает нам возможность разбить все на службы и классыи отдельные файлы, где эти файлы имеют только определенные задачи.

Именно поэтому я предлагаю сначала создать отдельный файл socket.io, который обрабатывает его основные функции.

// socketio.js
let _io;
module.exports.runSocket = (server) => {
   _io = require('socket.io')(server);
   _io.on('connect', (socket) => {
      console.log('New socket connected', socket.id);
      // You will see here if connections are even being run;
      // You can have all kinds of listeners here for connected sockets,
      // Since i dont see that you are tracking anything, i will just leave it as is.
   });
}
module.exports.emitToAll = (type, payload) => {
   // This will emit to all connected sockets
   _io.emit(type, payload);
}

Затем в вашемapp.js

// app.js
const _sio = require('./socketio.js'); 
_sio.runSocket(server);

Больше нет необходимости отправлять IO в req, поскольку он запускается только один раз в функции запуска сокета;

И в вашем маршруте

const _sio = require('./socketio.js');

router.get('/event/emitEventUpdates', (req, res)=>{ 
        _sio.emitToAll('message', {type:'new-message', text: "message from server"})
        res.send({message : "all done from 
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...