Node.js 处理express中已在使用的端口错误
我正在尝试一种自动错误处理算法,如果端口已经在使用中,该算法将尝试重新启动服务。 该技术的工作原理如下:Node.js 处理express中已在使用的端口错误,node.js,express,Node.js,Express,我正在尝试一种自动错误处理算法,如果端口已经在使用中,该算法将尝试重新启动服务。 该技术的工作原理如下: 端口已在使用中发生错误,因此服务器将发出一个名为“error”的事件 向控制台打印“端口已在使用” 尝试重新连接到端口x次,每次尝试之间有5秒延迟 如果超出了所有可能的x尝试次数,请用有意义的消息拒绝承诺 输出应如下所示: Error: port 3000 already in use Note: trying to restart the service on port 3000... a
x
次,每次尝试之间有5秒延迟x
尝试次数,请用有意义的消息拒绝承诺Error: port 3000 already in use
Note: trying to restart the service on port 3000... attempts left 4 // 5 seconds later...
Note: trying to restart the service on port 3000... attempts left 3 // 5 seconds later...
Note: trying to restart the service on port 3000... attempts left 2 // 5 seconds later...
Note: trying to restart the service on port 3000... attempts left 1 // 5 seconds later...
Error: Server shutting down because port 3000 already being used by another service.
我已经尝试、测试和失败了大约7个小时
const express=require('express'))
const app=express()
常量侦听=(端口)=>{
返回新承诺((解决、拒绝)=>{
const server=app.listen(端口)
让时间=5
让持续时间=2000
left=5//向左尝试
设rmsg=true
server.on('正在侦听',()=>{
const message=`正在侦听端口${port}`
console.log(消息)
解析(消息)
})
server.on('error',异步(error)=>{
如果(error.code==='EADDRINUSE'){
左=左-1
让消息
如果(RMSG){
消息=(`port${port}已在使用中`)
console.log(消息)
Rmsg=false
}
message=`尝试在端口${port}上重新启动服务…尝试左${left}`
console.log(消息)
server.close()
while(左!==1){
console.log(左)
等待设置超时(()=>服务器。侦听(端口),持续时间)次数???
}
message=`服务器正在关闭`
拒绝(消息)
}
})
})
}
常数控制器={
听
应用程序,
}
module.exports=controller
,因为当您触发服务器时,它将在错误
事件上递归触发它。请侦听您的端口已被使用的
,因此您不需要使用while循环,请使用if条件来执行此操作。只有当条件与上次匹配时,您才拒绝错误
顺便说一下,我把你的条件改成了左0
server.on('error',(error)=>{
如果(error.code==='EADDRINUSE'){
左=左-1
让消息
如果(RMSG){
消息=(`port${port}已在使用中`)
console.log(消息)
Rmsg=false
}
message=`尝试在端口${port}上重新启动服务…尝试左${left}`
console.log(消息)
如果(左!==0){
console.log(左)
setTimeout(()=>server.listen(端口),持续时间)
}否则{
message=`服务器正在关闭`
拒绝(消息)
}
}
})
因此,您的外部js可以像这样使用它
const-app=require(“./app.js”)
异步函数main(){
试一试{
const result=等待应用程序侦听(5000)
日志(“外部结果”,结果)
}捕获(错误){
控制台日志(“外部错误”);
console.log(错误);
}
}
main()
因此,输出如下所示
若您的端口被其他节点进程释放,它将成功地侦听,如下图所示
我提供了我使用的测试代码
//app.js
const express=require('express')
const app=express()
常量侦听=(端口)=>{
返回新承诺((解决、拒绝)=>{
让服务器=app.listen(端口)
让时间=5
让持续时间=2000
left=5//向左尝试
设rmsg=true
server.on('正在侦听',()=>{
const message=`正在侦听端口${port}`
console.log(消息)
解析(消息)
})
server.on('error',(error)=>{
如果(error.code==='EADDRINUSE'){
左=左-1
让消息
如果(RMSG){
消息=(`port${port}已在使用中`)
console.log(消息)
Rmsg=false
}
message=`尝试在端口${port}上重新启动服务…尝试左${left}`
console.log(消息)
如果(左!==0){
console.log(左)
setTimeout(()=>server.listen(端口),持续时间)
}否则{
message=`服务器正在关闭`
拒绝(消息)
}
}
})
})
}
常数控制器={
听
应用程序,
}
module.exports=控制器
//d.js
const-app=require(“./app.js”)
异步函数main(){
试一试{
const result=等待应用程序侦听(5000)
日志(“外部结果”,结果)
}捕获(错误){
控制台日志(“外部错误”);
console.log(错误);
}
}
main()
非常有趣。。顺便说一句,当你尝试你的代码时,有哪些错误(比如出错的地方)?很难回答这个问题