想象一下我有两个.js文件,一个是app.js,另一个是socket.js
app.js的内容是这个:
const http = require("http");
const httpServer = http.createServer((_, res) => {
res.write("Hello World!");
res.end();
});
httpServer.listen(5000);
和我的socket.js:
const io = require("socket.io").listen(6000);
io.on("connection", socket => {
console.log("new connection!");
});
如您所见,我不需要在app.js内使用socket.js中的任何内容,但是要在socket.js中实际运行内容,我需要执行require('./socket.js')
之类的操作,但感觉好像不是不是最好的解决方案。在这种情况下最好的办法是什么? (另一个示例是当您不需要导出数据库连接时,使用mongoose启动像Mongodb这样的数据库连接)
您在这里有错。实际上,您从该文件中需要某些东西,而该功能实际上是引导您提到的另一个示例中的socket.io或mongoose的函数。当您运行require('something')
节点时,加载文件并开始在其中执行代码,因此该功能实际上是整个文件。
因此,您可以只在require('socket.js')
文件中使用server.js
并删除它;)总的结论是,您无需导出任何内容即可使用require
。
您要问的是不可能的。您无法使用node在同一进程中启动两个单独的文件。节点仅读取one文件,然后从require
的位置继续读取下一个文件。唯一的方法是运行两个节点进程...但这是另一个问题,它增加了不必要的复杂性,并且在您的应用程序中也无法做到。所以甚至不要尝试:)
但是您可以使用更简洁,更一致的模式,就像这样:
在名为server.js
的文件中:
const http = require("http");
const httpServer = http.createServer((_, res) => {
res.write("Hello World!");
res.end();
});
function startServer(port = 5000) {
httpServer.listen(port);
}
module.exports = startServer;
在另一个名为socket.js
的文件中:
const io = require("socket.io");
io.on("connection", socket => {
console.log("new connection!");
});
function startSocket(port = 6000) {
io.listen(port);
}
module.exports = startSocket;
然后在您的app.js
中:
const startServer = require('./server.js');
const startSocket = require('./socket.js');
startServer(5000);
startSocket(6000);
这样,您可以抽象化应用程序的引导逻辑,分别引导每个组件,但是允许您从一个中央模块控制设置(例如:端口)。
require
完全没有分配的模块就很好。对于语义,您可能希望在同一app
模块中启动两个服务器。如果从io
模块中导出socket
服务器,则可以这样做:
const io = require("socket.io")();
io.on("connection", socket => {
console.log("new connection!");
});
module.exports = io;
然后在.listen()
中对其调用app.js
:
const http = require("http");
const socketServer = require('./socket');
const httpServer = http.createServer((_, res) => {
res.write("Hello World!");
res.end();
});
httpServer.listen(5000);
socketServer.listen(6000);