如何运行另一个.js文件的内容?

问题描述 投票:0回答:2

想象一下我有两个.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这样的数据库连接)

node.js
2个回答
0
投票

您在这里有错。实际上,您从该文件中需要某些东西,而该功能实际上是引导您提到的另一个示例中的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);

这样,您可以抽象化应用程序的引导逻辑,分别引导每个组件,但是允许您从一个中央模块控制设置(例如:端口)。


0
投票

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);
© www.soinside.com 2019 - 2024. All rights reserved.