Почему сервер-отправленное событие не запускается на внешнем интерфейсе при наличии события и данных? - PullRequest
0 голосов
/ 21 мая 2019

Я хотел бы сделать демонстрацию использования отправленных сервером событий с Express.js, создав приложение с файлом HTML с формой публикации и основным файлом JS, используя встроенный пакет событий node.js и получивосновы в статье MDN https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events.

Операционная система - Win10, версия node.js - 10.15.1, единственная прямая зависимость - экспресс ^ 4.17.0, фактическая версия - 4.17.0.

js

app.use(bodyParser.urlencoded({extended: false}));

app.get('/consoleEvent', function(req,res){
  res.writeHead(200, {
    'Content-Type': 'text/event-stream',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
  });
  res.write('');
  myEmitter.on('postConsoleEvent', function(data, event){
    if(data && event) {
      res.write(`event: ${event}${'\n'}data: ${data}${'\n\n'}`);
    } else if(data){
      res.write(`data: ${data}${'\n\n'}`);
    } 
  })
});

app.post('/postConsoleEvent', function(req, res){
  if(!req.body || !req.body.data){
    res.status(204).end(); // on bad request sending 204 to ignore request, 400 will redirect user to error
  } else {
    myEmitter.emit('postConsoleEvent', req.body.data, req.body.event);
    res.status(204).end();
  }
})

app.get('/', function(req, res){
  res.sendFile(path.join(__dirname + '/index.html'));
});

index.html


    <script>
      // using old syntax for being more sure in browser compatibility
      var consoleEvent = new EventSource('/consoleEvent');
      consoleEvent.onmessage = function(e) {
        console.log('onmessage triggered'); // does not trigger on both event and data
        if (e.event){
          console.log('Event: "'+e.event+'"; Data: "'+e.data+'"');
        } else {
          console.log('Data: "'+e.data+'"');
        }
      }
    </script>



    <form action="/postConsoleEvent" method="POST">
      <label for="eventField">Event: </label><br>
      <input type="text" name="event" id="eventField" /><br>
      <label for="dataField">Data: (required, if omitted nothing will happen) </label><br>
      <input type="text" name="data" id="dataField" /><br><br>
      <input type="submit" value="submit">
    </form>

Все работает нормально, если вы вводите только «данные», но если вы используете оба поля, сервер пишет оба »событие "и" данные "в разных строках, но внешнее событие не запускается.

...