简体   繁体   English

我正在尝试使用 module.exports 和 require 将我的逻辑放在一个单独的文件中,但是,我似乎无法弄清楚

[英]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.最近我拿起了 Node.js + Express.js 以便将它们与 Socket.io 配对并制作一个实时聊天应用程序。 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.问题是,由于我对 Node.js 和 Express.js 相对缺乏经验,因此在弄清楚将逻辑放在何处以及如何将其分隔到不同文件中时遇到了一些麻烦。 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.现在,创建我的 Socket.io 命名空间的逻辑在www文件中,我正试图找出将它放在哪里。 Right now it looks like this:现在它看起来像这样:

www File: www文件:

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文件并将其放在一个名为utility的文件夹中,将代码从www移动到socket.js文件并尝试将服务器从我的 www 文件导出到我的 socket.js 文件所以Socket.io 可以访问它:

socket.js File: socket.js文件:

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: www文件:

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.当你这样做时, socket.js文件中的module.exports = createSocketServers ,你实际上是在导出构造函数。

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;如果你想像现在一样保留它,你必须从socket.js文件中导出一个 object;

module.exports = { createSocketServers }

After exporting your module like above, you have to run it like below;像上面那样导出模块后,你必须像下面那样运行它;

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 我的CSS问题似乎无法弄清楚 - Issue with my CSS that I can't seem to figure out 如果我在`global`上定义模块,`module.exports`有什么好处? - What is the benefit of `module.exports` if I'm defining modules on `global`? 为什么我不能修改module.exports? 为什么我的浏览器在 `npm run build` 没有问题后会抱怨? - Why can't I modify module.exports? Why does my browser complain after no problems from `npm run build`? 回复:如何将javascript AMD模块导入外部TypeScript模块? (使用module.exports =…时) - Re: How can I import a javascript AMD module into an external TypeScript module? (When using module.exports=…) 有什么办法可以做到这样我就不必重新声明 module.exports 的依赖项了吗? - Is there any way I can make it so I don't have to redeclare dependencies for module.exports? 我可以在Node中以编程方式更改.js文件的module.exports中的JSON对象吗? - Can I change a JSON object that is in module.exports of a .js file programmatically in Node? Javascript module.exports和require - Javascript module.exports and require 操作模块。导出并要求 - Operation module.exports and require 在对文件进行require()操作时是否必须定义module.exports? - Does module.exports have to be defined when require()-ing a file? 如何在 nodeJS 中使用 module.exports 要求 .json 文件 - How to require .json file with module.exports in nodeJS
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM