数据库更改如何通过节点js发送到Web客户端?

时间:2019-05-30 05:35:29

标签: node.js express websocket dashboard

我正在使用管理仪表板开发Web应用程序,我需要在仪表板上显示通知,新用户注册等,并且我不想使用诸如pusher,firebase等第三方通知库。正常工作如何?

我尝试每隔x秒查询一次以查看http ajax请求对服务器的任何新更改,但是我意识到这不是正确的方法,并且可能会使服务器处理超负荷。我正在考虑使用websocket,然后当服务器从其他客户端收到新的发布请求时,将消息发送到仪表板,但是我不确定如何正确使用websocket(当数据更改了如何通过套接字发送时)。

如果websocket不是理想的解决方案,请问该如何正常工作?任何有关如何在服务器端与ws对象进行交互的教程或示例都将受到赞赏(如果websocket是理想的解决方案)

1 个答案:

答案 0 :(得分:0)

经过研究,我想出了一个解决问题的方法。我希望这可能对其他人有所帮助,或者我可以通过从其他人那里获得一些反馈或对我的解决方案采取更好的方法来改善自己的解决方案。

只需两个文件即可使它工作

客户端(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`);
});