Сервер инициировал сообщения websocket сервер-клиент в nodejs? - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть приложение node js, которое получает данные от сенсорного устройства через запросы POST. Он также служит интерфейсом для мониторинга этих данных. Я хочу, чтобы он отправлял обновления данных через websocket всем подключенным клиентам

Вот что я придумал:

const express = require('express');
const app = express();
const expressWs = require('express-ws')(app);
const ws = expressWs.getWss('/ws');

function sendAll(data) {
  ws.clients.forEach(function each(client) {
    client.send(JSON.stringify(data));
  });
}

setInterval(async () => {
  try {
    let message = { message: 'dataUpdated', data: { foo: 'bar } };
    sendAll(message);
  } catch (err) {
    console.error(err);
  }
}, 1000 * 5);

app.use(express.static('./static/'));
// tell the app to parse HTTP body messages
app.use(bodyParser.json());

// routes
const apiRoutes = require('./api/routes/api-routes');
app.use('/api', apiRoutes);

module.exports = app;

Я могу использовать функцию sendAll для трансляции данных. Но я хотел бы также иметь возможность использовать эту функцию внутри apiRoutes, где я обрабатываю входящие запросы от датчика. Как я могу передать его туда, или, возможно, получить доступ к экземпляру expressWs и создать ту же функцию во включенном файле api-routes?

1 Ответ

0 голосов
/ 09 ноября 2019

Решение оказалось довольно простым =)

const express = require('express');
const app = express();
const expressWs = require('express-ws')(app);
const ws = expressWs.getWss('/ws');

export function wsBroadcast(data) {
  ws.clients.forEach(function each(client) {
    client.send(JSON.stringify(data));
  });
}

app.use(express.static('./static/'));
// tell the app to parse HTTP body messages
app.use(bodyParser.json());

// routes
const apiRoutes = require('./api/routes/api-routes');
app.use('/api', apiRoutes);

module.exports = app;

А затем просто импортируйте его в файл, который нужен для трансляции сообщений:

import express from 'express';
import { wsBroadcast } from '../server';

const router = express.Router();

router.post('/data', (req, res) => {
  wsBroadcast({ message: 'gotData', data: req.body });
  ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...