簡體   English   中英

io.sockets.on無法在Node.js中的路由中工作

[英]io.sockets.on not working inside a route in Node.js

我正在嘗試在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()?

根據您的代碼, io是附加到http.Server實例的Socket.IO服務器實例,用於偵聽傳入事件。 然后在路由中再次附加一個實例來監聽不起作用的傳入事件。 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; 

我將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;

};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM