Как настроить Socket.io для прослушивания отдельных страниц с Express NodeJS - PullRequest
0 голосов
/ 20 мая 2018

У меня есть следующая server.js структура файла, где у меня две страницы, и только для последней /chat страницы мне нужно реализовать прослушиватель событий с помощью библиотеки Socket.io:

'use strict'

const app = require('express')();
const server = require('http').Server(app);
const io = require('socket.io')(server);

const index = require('./routes/index');
const chat = require('./routes/chat');

app.use('/', index);
app.use('/chat', chat);

// sockets.io code part start...
app.use((req, res, next) => { 
    res.locals['socketio'] = io; 
    next(); 
});
// sockets.io code part finish...

const port = process.env.API_PORT || 8989;
server.listen(port, () => {
    console.log(`Server running on port ${port}`);
});

Что яполучить эту структуру?Мой server прослушивает все, что входит на сайт по localhost:3000 и localhost:3000/chat, это неправильно.Итак, я думаю, что мне нужно реализовать свою часть кода, которая отвечает за обработку sockets.io событий по определенному маршруту /chat ...

У меня был следующий файл chat.js в моей системе маршрутов:

const express = require('express');
const router = express.Router();

router.use(function timeLog(req, res, next) {
    console.log('Time: ', Date.now());
    next();
});

router.route('/chat')
    .get((req, res) => {
        let messages = [];
        let userCounter = 0;
        let users = [];

        const io = res.locals['socketio'];
        io.on('connect', (socket) => {
            console.log('Connection established!');
            socket.on('new user', (message) => {
                userCounter++;
                users.push(userCounter)
                console.log('New user is in! Count of users online:', users)
            });

            socket.emit('new connect', messages);

            socket.on('message data', (message) => {
                console.log(message);
                messages.push(message);
                io.emit('New message:', message);
            });
        });
        res.json('Hello on the Chatpage!');
    });

module.exports = router;

Как я могу реализовать sockets.io в моем случае только для /chat страницы без глобального вызова socket.io library в server файле или это невозможно?Мне нужна помощь ...

Спасибо!

Ответы [ 3 ]

0 голосов
/ 21 мая 2018

Проблема в том, что вам нужно обновить HTTP-соединение до соединения с веб-сокетом, поэтому вам все еще нужен socket.io на главной странице ...

0 голосов
/ 21 мая 2018

Вы можете отделить код, связанный с сокетом, следующим образом:

==> app.js

var express = require('express');
var socket = require('./socketServer');
var app = express();
var server = app.listen(3000, function () {
    console.log('Listening on port 3000 ...');
});
socket.socketStartUp(server);
module.exports = app;

==> socketServer.js

var io = require('socket.io')();
var socketFunction = {}
socketFunction.socketStartUp = function (server) {
    io.attach(server);
    io.on('connection', function (socket) {
        console.log("New user is connected with socket:", socket.id);
    })
}
module.exports = socketFunction;

Вы также можете проверить код запуска API узла с функциональностью сокета по ссылке ниже:

нажмите здесь

Надеюсь, что ответполезно для вас

0 голосов
/ 20 мая 2018

Обновите ваш код соответствующим образом:

    // Declare socket.io
    const io = require('socket.io')(server);

    // Set middleware
    app.use((req, res, next)=>{ res.locals['socketio'] = io; next(); });

    // Later in a chat route
    router.get('/chat', (req, res, next)=>{
      const io = res.locals['socketio']
    });

Надеюсь, это решит ваш запрос.

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