我正在使用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作为参数传递它们。如何将这些超时对象保存到数据库?或者是否有更好的方法来清除超时而不是将它们保存到数据库。提前感谢您提供的任何帮助。
答案 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
工作类型)可能涉及工作经纪人或消息队列,群集和工作人员订阅他们可以为自己的工作收听的内容取消信号等。
我希望这可以帮助您解决一些需求。