【问题标题】:Store settimeout id from nodejs in mongodb将来自nodejs的settimeout id存储在mongodb中
【发布时间】:2015-02-18 09:22:51
【问题描述】:

我正在使用 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 将它们作为参数传入。如何将这些超时对象保存到数据库中?或者有没有比将超时保存到数据库更好的方法来清除超时。提前感谢您提供的任何帮助。

【问题讨论】:

    标签: node.js mongodb settimeout


    【解决方案1】:

    您不能在数据库中保存实时 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 作业类型)可能涉及作业代理或消息队列、集群和工作人员,它们订阅了他们可以为自己的作业取消信号收听的内容等等

    我希望这可以帮助您弄清楚您的要求。

    【讨论】:

    • 感谢您的解决方案。应查看消息队列。现在,我将采用上述给出的解决方案。我使用 setTimeout 是因为我不定期播放事件,而是按预定的时间差播放事件。我在问题中使用的代码只是一个例子。谢谢!
    • 添加到此,用于文档的 JSON.stringify(timer) 将导致TypeError: Converting circular structure to JSON
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 2013-09-15
    • 2017-06-20
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 2018-01-01
    相关资源
    最近更新 更多