简体   繁体   中英

I'm attempting to put my logic in a separate file using module.exports and require, however, I can't seem to figure it out

Recently I picked up Node.js + Express.js in order to pair them with Socket.io and make a real time chat application. The problem is that since I'm relatively inexperienced with Node.js and Express.js, I'm having some trouble figuring out where to put my logic and how to separate it in different files. Right now, the logic that creates my Socket.io namespaces is in the www file and I'm trying to figure out where to place it. Right now it looks like this:

www File:

var app = require('../app');
var http = require('http');
var server = http.createServer(app);

let io = require('socket.io')(server);

servers.forEach((server) => {
    console.log(server.name)
    io.of(server.endpoint).on('connection',(socket) => {

        socket.on('messageToServer', (message) => {
            let roomName = Object.keys(socket.rooms)[1]
            let room = server.room.find((room) => {
                return room.name == roomName
            })
            room.history.push(message)

            io.of(server.endpoint).to(roomName).emit('messageToClient', message)
        })

        socket.on('joinRoom', (roomToJoin) => {

            let roomToLeave = Object.keys(socket.rooms)[1]

            socket.leave(roomToLeave)
            socket.join(roomToJoin)

            let room = server.room.find((room) => {
                return room.name == roomToJoin
            })

            socket.emit('chatHistory', room.history)
        })

    })
});

What I tried is the following - I created a socket.js file and put it in a folder called utility , moved the code from www to the socket.js file and tried exporting the server from my www file to my socket.js file so that Socket.io can access it:

socket.js File:

let server = require('../bin/www').server
let io = require('socket.io')(server);

function createSocketServers() {

    servers.forEach((server) => {
        console.log(server.name)
        io.of(server.endpoint).on('connection',(socket) => {

            socket.on('messageToServer', (message) => {
                let roomName = Object.keys(socket.rooms)[1]
                let room = server.room.find((room) => {
                    return room.name == roomName
                })
                room.history.push(message)

                io.of(server.endpoint).to(roomName).emit('messageToClient', message)
            })

            socket.on('joinRoom', (roomToJoin) => {

                let roomToLeave = Object.keys(socket.rooms)[1]

                socket.leave(roomToLeave)
                socket.join(roomToJoin)

                let room = server.room.find((room) => {
                    return room.name == roomToJoin
                })

                socket.emit('chatHistory', room.history)
            })

        })
    });
}

module.exports = createSocketServers

www File:

var app = require('../app');
var http = require('http');

var server = http.createServer(app);
module.exports = server
require('../utility/socket').createSocketServers

As soon as I did that, my code stopped working, so I can only assume I haven't done it correctly, hence why I'm here asking for help. Thanks!

Everything looks fine except this line

require('../utility/socket').createSocketServers

When you do, module.exports = createSocketServers in socket.js file, you actually exporting the constructor.

If you run what you require, it should work;

require('../utility/socket')()

If you want to keep it like you do now, you have to export an object from socket.js file;

module.exports = { createSocketServers }

After exporting your module like above, you have to run it like below;

require('../utility/socket').createSocketServers()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM