io.sockets.on не работает внутри маршрута в Node.js - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь использовать io.sockets.on внутри маршрута в приложении Node.js и Express. Я следовал тому, что здесь сказано: https://stackoverflow.com/a/31277123/8271839

Я могу успешно отправлять события io.sockets.emit, но не могу получать события с io.sockets.on.

Вот мой код:

index.js:

const cors = require('cors');
const express = require('express');
const app = express();
const server = require('http').Server(app);
const io = require('socket.io')(server);
const taskRequest = require('./routes/taskRequest');

app.use(cors())
app.use(express.json());
app.use('/api/taskRequest', taskRequest);

app.set('socketio', io);

server.listen(4002);

io.sockets.on("connection",function(socket){
    console.log("connected");
    socket.on("connected", function (data) {
        console.log("hello");
    })
});

маршруты / taskRequest.js:

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

router.post('/', async (req, res) => {

    var io = req.app.get('socketio');

    //pickedUser is one of the connected client
    var pickedUser = "JZLpeA4pBECwbc5IAAAA";

    //we only send the emit event to the pickedUser
    io.to(pickedUser).emit('taskRequest', req.body);

    io.on('connection', function (socket) {
        console.log('connected 2');
        socket.on('taskResponse', function () {
            console.log('hello 2');
        });
    });

});

module.exports = router; 

Когда клиент подключен, я получаю сообщение «подключено» в консоли, но не сообщение «подключено 2».

Кроме того, когда клиент отправляет сообщение «подключен», я получаю «hello» в консоли, но когда клиент отправляет сообщение «taskResponse», я не получаю «hello 2» в консоли.

Хотя при вызове io.to(pickedUser).emit('taskRequest', req.body); он работает, клиент получает сообщение «taskRequest».

Почему .emit () работает внутри моего маршрута, а не .on ()?

Ответы [ 2 ]

2 голосов
/ 23 мая 2019

Согласно вашему коду, io - это экземпляр сервера Socket.IO, подключенный к экземпляру http.Server, который прослушивает входящие события. Затем внутри маршрута вы снова присоединяете экземпляр для прослушивания входящих событий, который не работает. io.to(pickedUser).emit работает, потому что экземпляр сервера с socketio правильно прослушивает соединение, предоставляя console.log ("connected");.

index.js:

const cors = require('cors');
const express = require('express');
const app = express();
const server = require('http').Server(app);
const io = require('socket.io')(server);
const taskRequest = require('./routes/taskRequest');

app.use(cors())
app.use(express.json());
app.use('/api/taskRequest', taskRequest);

app.set('socketio', io);

server.listen(4002);

маршруты / taskRequest.js:

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

router.post('/', async (req, res) => {

    var io = req.app.get('socketio');

    //pickedUser is one of the connected client
    var pickedUser = "JZLpeA4pBECwbc5IAAAA";

    io.on('connection', function (socket) {
        console.log('connected 2');
        io.to(pickedUser).emit('taskRequest', req.body);
        socket.on('taskResponse', function () {
            console.log('hello 2');
        });
    });

});

module.exports = router; 
1 голос
/ 26 мая 2019

Я отмечаю ответ TRomesh как правильный ответ, поскольку в вашем коде действительно может быть только один io.on('connection', function (socket) {}).

Теперь вот что я сделал, чтобы это сработало для меня: проблема заключалась в том, что если вы поместите io.on('connection', function (socket) {}) в свой router.post('/', async (req, res) => {}), он будет срабатывать только при вызове конечной точки.В моем случае у меня было несколько событий сокетов, которые я хотел вызвать в любое время, а не только при вызове конечной точки.Поэтому я должен был поместить io.on('connection', function (socket) {}) вне моего router.post('/', async (req, res) => {}).Таким образом, я не мог использовать var io = req.app.get('socketio'); внутри маршрутизатора.Вот что я сделал вместо этого:

index.js:

const cors = require('cors');
const express = require('express');
const app = express();
const server = require('http').Server(app);
const io = require('socket.io')(server);
const taskRequest = require('./routes/taskRequest')(io);

app.use(cors())
app.use(express.json());
app.use('/api/taskRequest', taskRequest);

server.listen(4002);

routs / taskRequest.js

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

module.exports = function(io) {

    //we define the variables
    var sendResponse = function () {};

    io.sockets.on("connection",function(socket){
        // Everytime a client logs in, display a connected message
        console.log("Server-Client Connected!");

        socket.on('connected', function(data) {
            //listen to event at anytime (not only when endpoint is called)
            //execute some code here
        });

        socket.on('taskResponse', data => {
            //calling a function which is inside the router so we can send a res back
            sendResponse(data);
        })     
    });

    router.post('/', async (req, res) => {

        //pickedUser is one of the connected client
        var pickedUser = "JZLpeA4pBECwbc5IAAAA";
        io.to(pickedUser).emit('taskRequest', req.body);

        sendResponse = function (data) {
            return res.status(200).json({"text": "Success", "response": data.data});
        }

    });

    return router;

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