window.onload не работает на странице NodeJS - PullRequest
2 голосов
/ 16 марта 2019

Я делаю приложение NodeJS с Express и Socket.io.Я пытаюсь отправить некоторые данные в виде объекта с сервера на клиент, и я хочу, чтобы это произошло, когда страница была загружена.Затем некоторый HTML-код можно изменить с помощью полученного объекта.Я уверен, что это возможно с Socket.io.Однако при использовании window.onload = function() {...} ничего не происходит.window.onload даже не вызывается.

Когда я пытаюсь сделать это без использования NodeJS (просто используя страницу HTML), все работает нормально.window.onload называется и все идет хорошо.Так почему же это не работает в NodeJS?Я знаю, что он ожидает загрузки всех изображений и т. Д., И у него есть проблема с этим , но теперь это в основном решено.Изображение загружается нормально.(Я все еще не могу загрузить его с помощью background-image, разве это имеет значение?)

Кроме того, правильно ли я отправляю данные с сервера на клиент?Я бы предпочел использовать Socket.io, чем изучать что-то новое, например Angular или React.

Вот мой код:

main.js (клиент)

window.onload = function() {
  console.log('window loaded');   // this shows when not in NodeJS app
  alert('window ready');          // neither does this
  socket.emit('pageReady');       // so this doesn't run
}

socket.on('pageInfo', function(response) {
  console.log('page info received');    //this doesn't run either
  document.getElementById("schoolName").innerHTML = response.school_name;
});

app.js (сервер)

io.on('pageReady', function() {
  io.emit('pageInfo', response);       // response is defined earlier
  console.log('page ready recieved');  // this doesn't show
});

1 Ответ

2 голосов
/ 16 марта 2019

Относительно того, что window.onload не запускается при работе веб-сервера, звучит очень странно; ваши реализации выглядят хорошо. Может быть, как будто вы никогда не заканчиваете загружать какие-то активы?

Относительно вашей реализации socket.io:

Вы отправляете события от socket до socket.emit(), но вы слушаете события, отправленные на ваш сервер, а не на подключенный сокет.

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

io.on("connection", (socket) => {

  socket.on('pageReady', function() {
    socket.emit('pageInfo', response);
    console.log('page ready recieved');
  });

}

Что касается использования socket.io в этом случае

В этом случае использование socket.io звучит как-то неестественно, когда вы, по сути, хотите вызвать сервер (fetch()) и получить ответ с данными для использования. Для этого я бы порекомендовал использовать fetch API и структурировать ваше экспресс-приложение, больше похожее на REST API:

Сервер:

var app = Express();

app.get('/data', (request, response) => {
   response.send("hello");
}

клиент:

fetch('/data')
  .then((data) => {
    console.log(data); // => hello
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...