Отправка уведомления клиентам в Node.JS - PullRequest
1 голос
/ 08 мая 2020

В приложении Node JS я хочу, чтобы мой сервер мог отправлять уведомление клиентам, в некоторых случаях c. Обыскивая net по этой теме, я нахожу Service Workers, которые, кажется, мне нужны; но я не совсем уверен.

Вот почему. Когда я смотрю различные руководства и видео, мне кажется, что уведомления всегда исходят от какого-то клиента. Но я не этого хочу. Когда и что отправлять как уведомление, должен решать сервер, а не какой-то клиент. Итак, мои вопросы:

  1. Не понимаю ли я, как использовать Service Workers?
  2. Это правильный путь, чтобы мой сервер отправлял уведомление клиентам?

Если ответ на последний вопрос - НЕТ. Тогда каков правильный путь?

Ответы [ 3 ]

2 голосов
/ 08 мая 2020

Ответ: WebSockets .

Проверить Socket.IO . Это даст вам возможность получать живые уведомления на клиенте, и у вас будет полный контроль над ними.

1 голос
/ 08 мая 2020

Как ранее писал Димитар, вы можете использовать socket.io для отправки сообщений с сервера клиенту и наоборот. Это можно сделать так же просто:

//Server sent message:
io.on('connection', (socket) => {
  socket.emit('notificationToClient', 'Message'); //message sent from server to client 
  });
});

//Client receives the message:
const socket = io.connect('http://localhost:3000');
  socket.on('notificationToClient', (data) => { //received message 
    console.log(data);
  });

API websocket немного менее запутан, чем socket.io, но IMO, я бы go с socket.io, поскольку он уже имеет дело с большим количеством тяжелой работы, такой как повторное подключение, пользовательские пространства имен, комнаты и т. д. c. На socket.io есть несколько курсов fantasti c udemy.

См. Документацию по socket.io здесь: https://socket.io/docs/

Обновление от 9.05.2020:

Мишель - Поскольку вы спросили, как реализовать Socket.io в вашем коде, я дам вам пример того, как я реализовал эту технологию в своем последнем проекте. Я работал над веб-приложением, которое подключается к системам сигнализации ELK и может ставить / снимать эти системы с охраны, а также получать входные сигналы датчиков (звуковые сигналы) в любом удаленном месте. Размер бэкэнда - Node.js, а пользовательского интерфейса - React.

//client side code

import React, { Component, Suspense } from 'react';
import panels from "./panels.js"

const socketConnection = io("http://localhost:5000"); //Socket.io

function App() {

    function handleClick(panel) {
        socketConnection.emit("panelData", panel); //Socket.io - sends the connection data for the ELK alarm panel to the express server

        socketConnection.on('data', (data) => { //Socket.io - receives data from the server.
         //does something with the data
        })
    }
}

//server side code

const express = require('express');
const elkClient = require('elk-client');

const app = express();

const server = app.listen('5000', () => {
  console.log('------Server Running on 5000---------');
});

let io = new sio(server);

io.on("connection", (socket) => { //boilerplate code - establishes the "handshake" with the client.
 
    socket.on("panelData", async (msg) => { //receives the ELK connection parameters from the client. See client side code
    const client = new ElkClient({
                connection: { 
                  site: msg.name,
                  host: msg.host,
                }
              })
        await client.connect();

    client.on("message", (elkMessage) => { // This is NOT Socket.io - server is listening for emitted data from the alarm system - beam breaks, alarms, arm/disarm etc. [See event emitter][2]
                    if(elkMessage.messageType == 'A' && elkMessage.subMessageType == 'S') {
                      const armingStatusReport = {elkMessage};
                      socket.emit("data", armingStatusReport); //Socket.io - emits the received data to the client.
                    } 
            })

Я попытался упростить приведенный выше код, чтобы попасть в точку. Сервер использует параметры подключения, которые он получает от клиента, для подключения к удаленной системе охранной сигнализации. Затем сервер ожидает и прослушивает входящие данные с помощью client.on () (эмиттер событий, а не socket.io). По мере получения данных я использую Socket.io для отправки полученных данных обратно клиенту с помощью socket.emit (); Из-за того, как работают системы сигнализации, данные отправляются на основе событий, поэтому api выборки не соответствует требованиям, в отличие от socket.io (или веб-сокетов).

Сообщите мне, могу ли я помочь с что-нибудь еще. В этом недавнем проекте я потратил последние несколько месяцев НАСИЛЬНО, работая с socket.io, включая пространства имен, комнаты и т. Д. c. Мне также пришлось создать приложение для мониторинга в реальном времени для управления производительностью моего сервера с использованием socket.io, поскольку я реализовал кластеризацию. Не стесняйтесь обращаться ко мне в любое время!

0 голосов
/ 08 мая 2020

А как насчет использования библиотеки twilio для управления заданием уведомления. Библиотека twilio

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...