节点进程在后续请求中找不到setTimeout对象

时间:2018-07-12 08:58:47

标签: node.js express websocket socket.io settimeout

我正在尝试在后续请求(使用express)中通过节点进程使用setTimeout方法清除超时设置。因此,基本上,我设置了直播事件开始时的超时(通过webhook通知),并旨在在一小时后为来宾用户停止该超时。正在通过setTimeout计算一小时,目前为止效果很好。但是,如果事件在一小时前停止,我需要清除超时。我正在尝试使用clearTimeOut,但找不到相同的变量。

// Event starts
var setTimeoutIds              = {};    
  var val  = req.body.eventId;
  setTimeoutIds[val] =  setTimeout(function() {

        req.app.io.emit('disable_for_guest',req.body);                                
        live_events.update({event_id:req.body.eventId},{guest_visibility:false},function(err,data){
                                            //All ok
         });
     }, disable_after_milliseconds);
     console.log(setTimeoutIds);                                        
     req.app.io.emit('session_started',req.body);

When event ends:
 try{
           var event_id = req.body.eventId;
           clearTimeout(setTimeoutIds[event_id]);
           delete setTimeoutIds[event_id];
      }catch(e){
           console.log('Event ID could not be removed' + e);
      }
 req.app.io.emit('event_ended',req.body);

输出:

Output

1 个答案:

答案 0 :(得分:0)

您正在处理程序范围内定义setTimeoutIds。您必须在模块级别定义它。

var setTimeoutIds = {};    

router.post('/webhook', function(req, res) {
     ...

这将使变量在下一次重新启动服务器之前可用。

注意:这种方法仅在您只有一台服务器且具有单个节点进程为您的应用程序提供服务的情况下有效。一旦进入多进程和/或多服务器,就需要一种完全不同的方法。