簡體   English   中英

如何設置Socket.io以使用Express NodeJS偵聽單獨的頁面

[英]How to setup Socket.io for listen separate pages with Express NodeJS

我有下一個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:3000localhost:3000/chat監聽站點上的所有輸入,這是錯誤的。 所以,我想我需要實現我的代碼部分,以響應處理特定路由/chat中的sockets.io事件。

我的路線系統中有下一個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;

在我的情況下,如何僅針對/chat頁面實現sockets.io,而不能在server文件中全局調用socket.io library呢?還是不可能? 我需要任何幫助...

謝謝!

您可以通過以下方式分離與套接字相關的代碼:

==> 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啟動代碼:

點擊這里

希望這個答案對您有幫助

相應地更新代碼:

    // 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']
    });

希望這可以解決您的查詢。

問題是您必須將HTTP連接升級為websocket連接,因此仍需要在主頁中使用socket.io。

暫無
暫無

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

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