Как изменения базы данных отправляются веб-клиенту с узла js? - PullRequest
0 голосов
/ 30 мая 2019

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

Я пытался запрашивать каждые x секунд, чтобы увидеть какие-либо новые изменения на сервере с помощью http ajax-запроса, но я понял, что это неправильный способ, и это может привести к перегрузке обработки сервера. Я думаю использовать websocket, а затем, когда сервер получает новый запрос на публикацию от другого клиента, отправить сообщение на панель инструментов, но я не уверен, как правильно использовать websocket (когда данные изменяются, как отправлять через сокет) ..

Если websocket не является идеальным решением, как это нормально работает? Любое руководство или пример того, как взаимодействовать с объектом ws на стороне сервера, будет высоко оценено (если websocket является идеальным решением)

1 Ответ

0 голосов
/ 31 мая 2019

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

Просто нужно два файла, чтобы это заработало

Клиентская часть (index.html)

<p>
  open console to see what is happening.
</p>
<script>
  const socketProtocol = (window.location.protocol === 'https:' ? 'wss:' : 'ws:')
  const echoSocketUrl = socketProtocol + '//' + window.location.hostname + ':3000/notifications/'
  const socket = new WebSocket(echoSocketUrl);

  console.log('Waiting for new notifications from server');

  socket.onmessage = e => {
    console.log('Message from server:', event.data)
  }
</script>

Серверная часть (server.js)

const WebSocket = require('ws');
const express = require('express')
var expressWs = require('express-ws');
var expressWs = expressWs(express());

var app = expressWs.app;

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

app.get('/customers', function(req, res) {
  res.send('Showing list of customers');

  NotifyDashboard('someone viewed list of customers..');
})

// websocket route
app.ws('/notifications', (ws, req) => {
  ws.on('close', () => {
    console.log('WebSocket was closed')
  })
})

// Let all dashboard clients know.
function NotifyDashboard(data) {
  expressWs.getWss('/notifications').clients.forEach(function each(client) {
    if (client.readyState === WebSocket.OPEN) {
      client.send(data);
    }
  });
};

app.listen(3000, function() {
  console.log(`http/ws server listening on 3000`);
});
...