Node.js集群错误

您好,我是非常新的node.js和JavaScript,我想创build一个culter.js与nodejs集群模块,在我的if语句结束时,我打电话server.js启动应用程序。

cluster.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; } 

server.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()尝试绑定服务器的端口号已被使用。

您需要validation端口是否已经在您的系统上被占用。 要做到这一点:

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

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

你应该检查pm2 list返回0进程。 另外,当你做一个pm2 stopAll ,套接字不会被释放。 不要忘了做一个pm2 kill ,以确保守护进程被杀死。

 $ pm2 kill Daemon killed 

validationWindows:

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

  • b显示创build每个连接或侦听端口所涉及的可执行文件。 在某些情况下,众所周知的可执行文件会托pipe多个独立的组件,在这种情况下,会显示创build连接或侦听端口所涉及的组件顺序。 在这种情况下,可执行文件的名称在底部是[],最上面是它所调用的组件,直到到达TCP / IP为止。 请注意,此选项可能会耗费时间,并会失败,除非您拥有足够的权限。

  • 以数字forms显示地址和端口号。

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

杀死在Windows命令行的示例:

如果您知道某个进程的名称( example notepad.exe),请使用命令提示符中的以下命令结束该进程:

 taskkill /IM notepad.exe 

要杀死某个进程的单个实例,请指定其进程ID(PID)。 example ,如果所需的进程具有827的PID,请使用以下命令来终止它:

 taskkill /PID 827 
 const throng = require('throng'); throng({ master: () => { console.log('Started master'); }, start: (id) => { console.log(`Started worker ${id}`); require('./server'); process.on('SIGTERM', () => { console.log(`Worker ${id} exiting...`); process.exit(); }); }, }); 

我不得不添加“人群”包https://www.npmjs.com/package/throng并遵循http://eslint.org/docs/rules/中的最新规&#x5219;

它现在适合我