在 Node.js 中使用群集时出错



我在node.js中使用集群来创建多个工作线程,但根据我的代码,我收到以下错误。

错误:

Error: bind EADDRINUSE null:3000
at listenOnMasterHandle (net.js:1420:16)
at rr (internal/cluster/child.js:121:12)
at Worker.send (internal/cluster/child.js:88:7)
at process.onInternalMessage (internal/cluster/utils.js:42:8)
at emitTwo (events.js:131:20)
at process.emit (events.js:214:7)
at emit (internal/child_process.js:762:12)
at _combinedTickCallback (internal/process/next_tick.js:142:11)
at process._tickCallback (internal/process/next_tick.js:181:9)

我的服务器代码文件如下。

应用.js:

const express = require('express'),
http    = require('http'),
cors    = require('cors'),
bodyParser = require('body-parser'),
xss    = require('xss-clean'),
helmet = require('helmet'),
cluster = require('cluster'),
os     = require('os'),
mongoSanitize = require('express-mongo-sanitize');

const app = express();
app.use(bodyParser.json({limit:'25mb'}));
app.use(cors());
app.use(bodyParser.urlencoded({limit: '25mb', extended: true}));
app.use(xss());
app.use(mongoSanitize());
app.use(express.static(__dirname+'/public'));


const server = http.createServer(app);


if(cluster.isMaster) {
let length = os.cpus().length;

for(let i = 0; i < length; i++) {
cluster.fork();
}
} else {

app.get('/', (req,res) => {
res.status(200).render('index.html');
})
}


server.listen('3000',() => {
console.log('server is running ar port 3000')
});

我正在使用以下命令来运行我的服务器。

nodemon npm start

在这里,我的问题是当我实施集群以创建多个工作线程时,这些错误即将到来,但在不使用集群的情况下,该文件正常运行。我需要解决此错误。

app.js的条件语句需要包装所有Express应用程序功能,因此,更新的文件将如下所示。

else {
const app = express();
app.use(express.static(__dirname + '/public'));
app.get('/', (req, res) => {
res.status(200).render('index.html');
});
const server = http.createServer(app);
server.listen('3000', () => {
console.log('server is running ar port 3000')
});
}

你可以有一个查看示例链接。

服务器声明必须位于else块内。

因此,您必须更改为:

if(cluster.isMaster) {
let length = os.cpus().length;

for(let i = 0; i < length; i++) {
cluster.fork();
}
} else {
app.get('/', (req,res) => {
res.status(200).render('index.html');
})
const server = http.createServer(app);

server.listen('3000',() => {
console.log('server is running ar port 3000')
});
}

如 nodejs 文档所述。

您需要在else 块内启动服务器

if(cluster.isMaster) {
let length = os.cpus().length;

for(let i = 0; i < length; i++) {
cluster.fork();
}
} else {
app.get('/', (req,res) => {
res.status(200).render('index.html');
})
server.listen('3000',() => {
console.log('server is running ar port 3000')
});
}

最新更新