Я пытаюсь настроить событие websockets для запуска по заданному запросу POST, но оно не работает. Я создал веб-сокет в server.js, и в настоящее время я могу отправлять сообщение WebSockets на сервер каждые 20 секунд, включив его в файл server.js:
var port = process.env.PORT || 8080;
const server = app.listen(port, () => console.log(`Listening on ${ port }`));
const wss = new SocketServer({ server });
wss.on('connection', (ws) => {
console.log('Client connected');
ws.on('close', () => console.log('Client disconnected'));
})
setInterval(() => {
wss.clients.forEach((client) => {
client.send(new Date().toTimeString());
});
}, 20000);
Приведенный выше код работает правильно. Я знаю, что он работает, потому что я включил этот сценарий на одну из страниц сайта, и он корректно обновляет элемент 'server-time':
var HOST = location.origin.replace(/^http/, 'ws')
var ws = new WebSocket(HOST);
var el = document.getElementById('server-time');
ws.onmessage = function (event) {
el.innerHTML = 'Server time: ' + event.data;
};
Но я не хочу просто отправлять данные на сайт каждые 20 секунд. Я пытаюсь вызвать событие, когда пользователь выполняет определенный запрос POST, поэтому я пытаюсь сохранить код на странице rout.js. Таким образом, в основном, вместо того, чтобы обновлять элемент «серверное время» каждые 20 секунд, я хочу, чтобы он обновлялся, когда пользователь нажимает определенную кнопку на сайте. Это нажатие кнопки запускает запрос POST, что я и хочу, чтобы вызвать изменения в HTML. Вот как это выглядит сейчас:
app.post( '/',function(req,res){
var port = process.env.PORT || 8080;
const server = app.listen(port, () => console.log(`Listening on ${ port }`));
const wss = new SocketServer({ server });
wss.clients.forEach((client) => {
client.send("Sending message");
});
res.render('pages/indextimewithall.ejs);
})
... но это приводит к ошибке EADDRINUSE. Моя проблема в том, что я думаю, что после того, как я создал веб-сокет в файле server.js, я не знаю, как правильно получить к нему доступ из файла rout.js. Есть идеи? Спасибо