我的NodeJS应用程序。关闭

时间:2017-02-17 15:35:04

标签: javascript node.js instance

  1. 我从CMD发起了Server.js个文件:node server
  2. Server.js文件会创建class A
  3. 的新实例
  4. Class A创建class B(Web套接字)和C(REST API)的新实例
  5. 如果在class B然后整个NodeJS应用中关闭/断开了网络套接字连接。只是停止/关闭。即使我试图再次“开始整个过程​​”...尝试在近距离事件中放置不同的代码 - 例如:
  6. 关闭事件被调用 - 但无论如何 - 我尝试“重新启动”我的应用程序的内容和方式。它不会执行我的代码 - 它只是关闭。

    我喜欢理解为什么以及正在发生什么,而不仅仅是重新启动整个应用程序 - 永远使用NPM ......

    更新:

    很抱歉没有让自己清楚。但实际上你正在寻找的细节是我的要点。 4 ...字面上没有 - 我没有再次执行整个节点应用程序...这就是为什么我使用“”(引号)...正如我所描述的那样我尝试再次启动该过程。('关闭')事件处理程序...我可以调试并查看代码何时到达事件处理程序中的点...但它不能再次执行/调用A.start()函数或通过激活事件...所以关于范围,实例,功能等的一些事情我正确地做不正确 - 这就是为什么我试图描述应用程序,类,功能......现在 - 我希望它更清楚我的意思: - )

    更新2:

    Server.js

    var dlManager = new DownloadManager();
    dlManager.initDownload('BTC-USD');
    

    下载-manager.js

     function DownloadManager() {
         this.initDownload = function(productList) {
    
             var wl = new WinLog();
             var restClient = new RestApiClient();
             var webSocketClient = new WsClient();
             wl.info('Running...');
    
             try {
    
                 // Removed a lot of not relevant code from here...
    
                 function startWS(productList) {
    
                     // 2. Make the WS begin to queuing all the newest trading data...
                     webSocketClient.initws(productList);
                 }
             } catch (err) {
                 wl.info('initDownload: ' + err);
             }
         }
     }
    
     function create() {
         return new DownloadManager();
     }
    
     module.exports = create;
    

    Wsclient.js

    function WsClient() {
    
        this.initws = function(productList) {
    
            var wl = new WinLog();
    
            try {
                var firstTime = true;
                var WebSocketEmit = new WSemitter();
                var activeQueue = [];
                var insertToDB = [];
                var cursorId = 0;
                var websocket = new Gdax.WebsocketClient(productList);
    
                websocket.on('message', function(data) {
    
                    // Removed a lot of not relevant code from here...
    
                });
    
                websocket.on('close', function close() {
    
                    wl.info('Disconnected');
    
                    //WebSocketEmit.connectionClosed(productList);
                    // Starts from the beginning once again ;-)
                    var new_dlManager = new DownloadManager();
                    new_dlManager.initDownload(productList);
                });
    
    
            } catch (err) {
                wl.error('initws: ' + err);
            }
        }
    
        this.SetHistoricalDataOK = function(value) {
            HistoricalDataOK = value;
        }
    }
    
    function create() {
        return new WsClient();
    }
    
    module.exports = create;
    

1 个答案:

答案 0 :(得分:1)

只要有活动元素仍然可以接收事件,节点应用程序就会保持活动状态。这可以包括TCP连接,监听服务器,计时器等......

只要这些都不存在且事件队列为空并且控制流返回系统(例如没有JS正在执行),那么节点应用程序将自行关闭。我们的想法是,如果没有任何东西可以在未来创建更多的事件,那么在这个节点应用程序中就没有其他任何事情可以发生,所以必须这样做。

如果您说当您尝试再次运行应用时,它将不再启动,那么这是一个不同的问题。您将需要记录错误和调试以找出可能的原因。如果您只是记录每个可能的位置,您可能会在应用启动代码中出现错误,您可能会发现错误的位置使其无法启动。既然你没有提供我们可以继续知道可能阻止这个问题的细节,我可以列举一些常见的东西:

  1. 某些进程仍在运行,可以控制某些资源(例如端口),当您尝试重新启动应用程序时,它会在无法访问该资源时关闭。

  2. 某些进程仍在运行,并且具有打开的文件资源,限制了您访问这些文件的能力。

  3. 首先,我会检查您的操作系统进程管理器,以验证您的原始应用程序实例是否仍在运行。您描述的症状使其听起来可能仍在运行并保留一些资源,使您的应用无法再次运行。

    当你的婚礼套接字关闭时,当你说“再次开始整个过程​​”时,这部分让我感到困惑。你真的试图在你的应用程序中再次执行node server.js吗?或者,你到底想要做什么?我们可能需要看到该代码来帮助您完成该特定操作。仅供参考,在关闭后重新建立webSocket连接应该没什么大不了的。您不必为了这样做而重新启动整个应用程序。