在 mongodb 中存储来自 nodejs 的 settimeout id
Store settimeout id from nodejs in mongodb
我是 运行 一个使用 express 和 nodejs 的网络应用程序。我有一个特定端点的请求,我在其中使用 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函数returns一个带有循环引用的对象。当试图将其保存到 mongodb 时,出现 stack_overflow 错误。我的目标是能够将 settimeout 返回的这些对象保存到数据库中。
我有另一个名为取消播放的端点,调用它时,将检索这些超时对象并调用 cleartimeout 将它们作为参数传入。如何将这些超时对象保存到数据库中?或者有没有比将超时保存到数据库更好的清除超时的方法。在此先感谢您提供的任何帮助。
您无法在数据库中保存实时 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
工作类型)可能涉及工作代理或消息队列、集群和工作人员订阅他们可以收听的内容自己的工作取消信号等
我希望这对您理清需求有所帮助。
我是 运行 一个使用 express 和 nodejs 的网络应用程序。我有一个特定端点的请求,我在其中使用 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函数returns一个带有循环引用的对象。当试图将其保存到 mongodb 时,出现 stack_overflow 错误。我的目标是能够将 settimeout 返回的这些对象保存到数据库中。
我有另一个名为取消播放的端点,调用它时,将检索这些超时对象并调用 cleartimeout 将它们作为参数传入。如何将这些超时对象保存到数据库中?或者有没有比将超时保存到数据库更好的清除超时的方法。在此先感谢您提供的任何帮助。
您无法在数据库中保存实时 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
工作类型)可能涉及工作代理或消息队列、集群和工作人员订阅他们可以收听的内容自己的工作取消信号等
我希望这对您理清需求有所帮助。