gpt4 book ai didi

javascript - Node.js 集群错误

转载 作者:行者123 更新时间:2023-11-30 15:20:39 26 4
gpt4 key购买 nike

你好我是 node.js 和 javascript 的新手,我正在尝试使用 nodejs 集群模块创建一个 culster.js,在我的 if 语句结束时我调用 server.js 来启动应用程序。

集群.js

const cluster = require('cluster');
const cpuCount = require('os').cpus().length;
const startServer = require('./server');

if (cluster.isMaster) {
for (let i = 0; i < cpuCount; i += 1) {
cluster.fork();
}
cluster.on('exit', () => {
cluster.fork();
});
} else {
return startServer;
}

服务器.js

const fs = require('fs');
const path = require('path');

const express = require('express');
const auth = require('http-auth');
const {
createBundleRenderer,
} = require('vue-server-renderer');

const bundle = fs.readFileSync('dist/server.js', 'utf-8');
const renderer = createBundleRenderer(bundle);

function parseIndexHtml() {
const [
entire,
htmlOpen,
htmlOpenTailAndHead,
headCloseAndBodyOpen,
bodyOpenTailAndContentBeforeApp,
contentAfterAppAndHtmlClose,
] = fs.readFileSync('index.html', 'utf8').match(/^([\s\S]+?<html)([\s\S]+?)(<\/head>[\s\S]*?<body)([\s\S]+?)<div id="?app"?><\/div>([\s\S]+)$/);

return {
entire,
htmlOpen,
htmlOpenTailAndHead,
headCloseAndBodyOpen,
bodyOpenTailAndContentBeforeApp,
contentAfterAppAndHtmlClose,
};
}

const indexHtml = parseIndexHtml();
const app = express();

const basicAuth = auth.basic({
realm: 'Jobportal',
}, (username, password, callback) => {
callback(username === 'x' && password === 'x');
});

app.get('/ping', (request, response) => {
response.status(200).end();
});

app.use(auth.connect(basicAuth));

// serve pure static assets
app.use('/public', express.static(path.resolve('./public')));
app.use('/dist', express.static(path.resolve('./dist')));

app.get('*', (request, response) => {
const context = {
url: request.url,
};

renderer.renderToString(context, (error, html) => {
if (error) {
if (error.code === '404') {
response.status(404).end(indexHtml.entire);
} else {
response.status(500).end(indexHtml.entire);
console.error(`Error during render: ${request.url}`); // eslint-disable-line
console.error(error); // eslint-disable-line
}
return;
}

const {
title,
htmlAttrs,
bodyAttrs,
link,
style,
script,
noscript,
meta,
} = context.meta.inject();

response.write(
`${indexHtml.htmlOpen} data-vue-meta-server-rendered ${htmlAttrs.text()} ${indexHtml.htmlOpenTailAndHead}
${meta.text()}
${title.text()}
${link.text()}
${style.text()}
${script.text()}
<script>
window.__INITIAL_STATE__ = ${JSON.stringify(context.initialState)}
</script>
${noscript.text()}
${indexHtml.headCloseAndBodyOpen} ${bodyAttrs.text()} ${indexHtml.bodyOpenTailAndContentBeforeApp}
${html}
<script src="/dist/client.js"></script>
${indexHtml.contentAfterAppAndHtmlClose}`
);

response.end();
});
});

const port = 8181;

// start server
app.listen(port, () => {
console.log(`server started at port ${port}`); // eslint-disable-line
});

我得到一个错误

server started at port 8181
events.js:163
throw er; // Unhandled 'error' event
^

Error: bind EADDRINUSE null:8181
at Object.exports._errnoException (util.js:1050:11)
at exports._exceptionWithHostPort (util.js:1073:20)
at listenOnMasterHandle (net.js:1336:16)
at rr (internal/cluster/child.js:111:12)
at Worker.send (internal/cluster/child.js:78:7)
at process.onInternalMessage (internal/cluster/utils.js:42:8)
at emitTwo (events.js:111:20)
at process.emit (events.js:194:7)
at process.nextTick (internal/child_process.js:766:12)
at _combinedTickCallback (internal/process/next_tick.js:73:7)
events.js:163
throw er; // Unhandled 'error' event
^

有什么想法吗?

最佳答案

EADDRINUSE表示 listen() 的端口号尝试将服务器绑定(bind)到已在使用中。

您需要验证该端口是否已在您的系统上使用。为此:

  • 在 Linux 上:sudo netstat -nltp | grep (port)在您的情况下是端口 8181。
  • 在 OSX 上:sudo lsof -i -P | grep (port)

如果有结果,需要kill过程(kill <pid>)。

你应该检查是否pm2 list返回 0 进程。此外,当您执行 pm2 stopAll ,套接字未释放。不要忘记做一个 pm2 kill确保守护进程被杀死。

$ pm2 kill
Daemon killed

Windows 验证:

C:\> netstat -a -b
  • a显示所有连接和监听端口。

  • b显示创建每个连接或监听端口所涉及的可执行文件。在某些情况下,众所周知的可执行文件托管多个独立组件,在这些情况下,会显示创建连接或监听端口所涉及的组件序列。在这种情况下,可执行文件名称位于底部的 [] 中,顶部是它调用的组件,依此类推,直到到达 TCP/IP。请注意,此选项可能很耗时,并且除非您有足够的权限,否则将会失败。

  • n以数字形式显示地址和端口号。

  • o显示与每个连接关联的所属进程 ID。

在 Windows 命令行中终止的示例:

如果您知道要终止的进程的名称,则为 example notepad.exe,在命令提示符下使用以下命令结束它:

taskkill /IM notepad.exe

要终止进程的单个实例,请指定其进程 ID (PID)。对于 example ,如果所需进程的 PID 为 827,请使用以下命令将其杀死:

taskkill /PID 827

关于javascript - Node.js 集群错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43777282/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com