ExpressJS – 抛出未处理的错误事件
我使用以下命令创build了expressjs应用程序:
express -e folderName npm install ejs --save npm install
当我运行与应用程序: node app.js
,我有以下错误:
events.js:72 throw er; // Unhandled 'error' event ^ Error: listen EADDRINUSE at errnoException (net.js:884:11) at Server._listen2 (net.js:1022:14) at listen (net.js:1044:10) at Server.listen (net.js:1110:5) at Object.<anonymous> (folderName/app.js:33:24) at Module._compile (module.js:456:26) at Object.Module._extensions..js (module.js:474:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:312:12) at Function.Module.runMain (module.js:497:10)
如何解决它?
你已经运行另一台服务器使用像8080一样的端口。
也许你在其他shell中运行了node app
,请closures它并重新运行。
当我们有时运行我们的快递应用程序时,我们也会得到类似的错 在这种情况下,我们必须遵循相同的原则。 我们需要检查它是否在任何terminal中运行。 如果您想查找并终止进程,请按照下列步骤操作:
- ps aux | grep节点
- 查找进程ID(从左边开始):
- kill -9 PRCOCESS_ID
要么
使用单个命令closures所有正在运行的节点进程。
ps aux | awk '/node/{print $2}' | xargs kill -9
如果你在Linux上,如果Nodejs没有以root身份运行,也会发生这个问题。
由此改变:
nodejs /path/to/script.js
对此:
sudo nodejs /path/to/script.js
刚刚发生在我身上,没有任何其他build议在这里修复它。 幸运的是我记得那个脚本是以root身份运行的。 希望这可以帮助别人!
免责声明:这可能不是生产环境的最佳解决scheme。 以root用户身份启动服务可能会给服务器/应用程序带来一些安全漏洞。 就我而言,这是一个本地服务的解决scheme,但是我鼓励其他人花更多的时间尝试隔离原因。
我通过更改端口来解决这个问题
app.set('port',process.env.PORT || 3000);
并改为:
app.set('port',process.env.PORT || 8080);
一个实例可能还在运行。 这将解决它。
killall node
正在尝试使用的端口节点已被其他程序使用。 在我的情况下,这是我最近安装的ntop 。 我不得不在浏览器中打开http:// localhost:3000 /来实现它。 这里给出了另一种查找过程的方法。
这是因为您用来运行脚本的端口已被使用。 您必须停止正在使用该post的所有其他节点。 因为你可以通过检查所有的节点
ps -e
杀死所有节点进程
sudo killall -9 node
如果你已经试过了在3000上监听所有的节点实例和其他服务(默认使用的是快速骨架设置),你应该检查一下,确保你的环境没有将“port”定义为意想不到的东西。 否则,你可能会得到相同的错误。 在快速骨架的app.js文件中,您会注意到第15行:
app.set('port', process.env.PORT || 3000);
为了解决这个问题,请终止或closures正在运行的服务器。 如果您正在使用Eclipse IDE,请按照以下步骤操作,
运行>debugging
用鼠标右键单击正在运行的进程,然后单击终止 。
closures任何正在运行的其他节点服务器,即使它们位于其他terminal窗口或运行在不同的端口上。 这应该解决这个问题。
在我的情况下,我也必须运行vagrant reload
。 即使没有节点进程在我的虚拟机上运行我的快车应用程序,我仍然得到这个错误,直到重新加载vagrant框。
停止使用该端口的服务。
sudo service NAMEOFSERVICE stop
在我的情况下,这个问题是由于在expressjs的`use'方法调用中忘记调用next()
造成的。
如果当前中间件没有结束请求 – 响应周期,则必须调用next()将控制权交给下一个中间件,否则请求将被挂起。
如果要使用相同的端口号,请在terminal中键入kill %
,这将终止当前的后台进程,并释放该端口以供进一步使用。
您也可以从Gruntfile.js中更改端口并再次运行。
在多次杀死同一进程之后,无法find8000端口上运行的其他东西,我意识到我试图在端口8000上运行两次:
之前:
MongoClient.connect(db.url, (err, database) => { if (err) return console.log(err); require('./app/routes')(app, database); app.listen(port, () => { console.log('We are live on ' + port); }); }); require('./app/routes')(app, {}); app.listen(port, () => { console.log("We are live on " + port); });
后:
MongoClient.connect(db.url, (err, database) => { if (err) return console.log(err); require('./app/routes')(app, database); app.listen(port, () => { console.log('We are live on ' + port); }); }); require('./app/routes')(app, {});
只是改变你的端口,可能是你目前的端口正在被iis或其他服务器使用。