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

我正在尝试一种自动错误处理算法,如果端口已经在使用中,该算法将尝试重新启动服务。 该技术的工作原理如下:

  • 端口已在使用中发生错误,因此服务器将发出一个名为“error”的事件
  • 向控制台打印“端口已在使用”
  • 尝试重新连接到端口
    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()
    
    非常有趣。。顺便说一句,当你尝试你的代码时,有哪些错误(比如出错的地方)?很难回答这个问题