从mongodb中的nodejs存储settimeout id

时间:2015-02-18 09:22:52

标签: node.js mongodb settimeout

我正在使用express和nodejs运行Web应用程序。我有一个特定端点的请求,我使用settimeout在不同的时间间隔后重复调用一个特定的函数。

例如

router.get ("/playback", function(req, res) {
    // Define callback here ...
    ....

    var timeoutone = settimeout(callback, 1000);
    var timeouttwo = settimeout(callback, 2000);
    var timeoutthree = settimeout(callback, 3000);
});

settimeout函数返回带有循环引用的对象。当试图将其保存到mongodb时,我得到一个stack_overflow错误。我的目标是能够将settimeout返回的这些对象保存到数据库中。

我有另一个叫做取消回放的端点,当被调用时,会检索这些超时对象并调用cleartimeout作为参数传递它们。如何将这些超时对象保存到数据库?或者是否有更好的方法来清除超时而不是将它们保存到数据库。提前感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:0)

您无法在数据库中保存实时JavaScript对象!也许您可以存储字符串或JSON或类似的引用,但不能存储实际的对象,以后不能重新加载它们。

编辑:此外,我刚刚注意到您正在使用setTimeout重复播放内容。如果您需要定期重复,为什么不使用setInterval

这是一个简单的解决方案,可以将索引保存在内存中:

var timeouts = {};
var index = 0;

// route to set the timeout somewhere
router.get('/playback', function(req, res) {
  timeouts['timeout-' + index] = setTimeout(ccb, 1000);
  storeIndexValueSomewhere(index)
  .then(function(){
    res.json({timeoutIndex: index});
    index++;
  });
}
// another route that gets timeout indexes from that mongodb somehow
req.get('/playback/indexes', handler);

// finally a delete route
router.delete('/playback/:index', function(req, res) {
  var index = 'timeout-' + req.params.index;
  if (!timeouts[index]) {
    return res.status(404).json({message: 'No job with that index'});
  } else {
    timeouts[index].cancelTimeout();
    timeouts[index] = undefined;
    return res.json({message: 'Removed job'});
  }
});

但这可能无法扩展到数百万个工作岗位。

更复杂的解决方案,可能更适合您的需求(取决于您的playback工作类型)可能涉及工作经纪人或消息队列,群集和工作人员订阅他们可以为自己的工作收听的内容取消信号等。

我希望这可以帮助您解决一些需求。