Как использовать socket.io для частичного обновления страницы после запуска кода на стороне сервера - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь использовать socket.io для выполнения простой операции в моем решении, построенном с использованием nodejs (express).Цель состоит в том, чтобы попросить пользователя загрузить файл, а когда операция загрузки завершится, отобразить на экране сообщение «файл загружен», не обновляя страницу.Для этого я использую следующий код:

на стороне сервера:

app.post('/fileupload', function(req, res) {
  // Upload file stuff here...
    mv(oldpath, newpath, function(err) {
      if (err) throw err;
      io.on('connection', function(socket) {
        console.log('sock connected');
        socket.emit('uploaded', {msg: 'File ' + files.filetoupload.name + 'uploaded to server'});
      });
      console.log('moved file');     
      res.sendFile(index);
    });
  });
});

и на стороне клиента:

<script src="/socket.io/socket.io.js"></script>
  <script>
    var socket = io();
      socket.on('uploaded', function (data) {
      console.log(data);
     $('#messagebox').html(data.msg);
    });
  </script>

где messagebox - это изначально пустой div вкоторый я хочу отобразить сообщение.

Этот код не работает.Код io.on('connection'... никогда не вызывается.Я переместил этот код за пределы маршрута приложения с помощью только оператора console.log, чтобы проверить, работает ли он и работает ли он.Я предполагаю, что я использую неправильное событие («соединение») здесь.Но я не могу найти в документации ничего, что позволило бы мне создать объект сокета, используя пользовательское событие.Кто-нибудь может мне помочь?

Если есть другой способ реализовать частичное обновление клиентской страницы на основе кода сервера (т.е. без использования сокета), я тоже открыт для изучения этого.Спасибо.

1 Ответ

0 голосов
/ 16 апреля 2019

Интересно, что я понял это вскоре после публикации этого вопроса (хотя я пытался это сделать несколько дней до этого).

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

var socket = io.on('connection', function(socket) {
  return socket;  
});

app.post('/fileupload', function(req, res) {
  //upload file stuff here
    mv(oldpath, newpath, function(err) {
      if (err) throw err;
      socket.emit('uploaded', {msg : 'File ' + files.filetoupload.name + ' uploaded to server'});
      });    
    });
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...