【问题标题】:io.sockets.on not working inside a route in Node.jsio.sockets.on 在 Node.js 的路由中不起作用
【发布时间】:2019-10-09 23:58:36
【问题描述】:

我正在尝试在 Node.js 和 Express 应用程序的路由中使用 io.sockets.on。我一直在关注这里所说的: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() ?

【问题讨论】:

    标签: javascript node.js express socket.io routes


    【解决方案1】:

    根据您的代码,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; 
    

    【讨论】:

    • 感谢您的回答。我明白为什么它不起作用。但是我怎样才能同时监听 index.js 文件和路由器上的事件呢?可能吗 ?或者我可以在整个代码中只使用一次 io.on() 吗?
    【解决方案2】:

    我将 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);
    

    路由/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;
    
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-16
      • 2018-10-19
      • 2017-04-29
      • 2019-08-28
      • 1970-01-01
      • 2016-07-11
      • 2016-09-05
      • 1970-01-01
      相关资源
      最近更新 更多