【问题标题】:how to store setTimeout id on mongodb database?如何在 mongodb 数据库上存储 setTimeout id?
【发布时间】:2018-10-09 10:53:53
【问题描述】:

我正在使用带有 express 的 NodeJs,我想将 setTimeout 的 id 存储到数据库中,以便以后可以使用 clearTimeout 我目前正在为此使用以下代码

var timerId = setTimeout(function(){
   console.log(id);
}, 100)

clearTimeout(timerId)

这段代码工作正常,但 timerId 包含一个对象,这就是为什么我无法将它存储在数据库中是否有任何其他方法可以这样做,或者是否有方法转换 MongoDB 可接受的对象

这是我在打印 timerId 时得到的对象

Timeout {
_called: false,
_idleTimeout: 5000,
_idlePrev:
 TimersList {
 _idleNext: [Circular],
 _idlePrev:
  Timeout {
    _called: false,
    _idleTimeout: 5000,
    _idlePrev: [Circular],
    _idleNext: [Circular],
    _idleStart: 5876,
    _onTimeout: [Function],
    _timerArgs: undefined,
    _repeat: null,
    _destroyed: false,
    [Symbol(asyncId)]: 252,
    [Symbol(triggerAsyncId)]: 250 },
 _unrefed: false,
 msecs: 5000,
 nextTick: false,
 _timer: Timer { _list: [Circular] } },
_idleNext:
 Timeout {
  _called: false,
  _idleTimeout: 5000,
  _idlePrev: [Circular],
   _idleNext:
     TimersList {
      _idleNext: [Circular],
     _idlePrev: [Circular],
     _unrefed: false,
     msecs: 5000,
    nextTick: false,
    _timer: [Timer] },
 _idleStart: 5876,
 _onTimeout: [Function],
 _timerArgs: undefined,
 _repeat: null,
 _destroyed: false,
  [Symbol(asyncId)]: 252,
 [Symbol(triggerAsyncId)]: 250 },
_idleStart: 6029,
_onTimeout: [Function],
_timerArgs: undefined,
_repeat: null,
_destroyed: false,
[Symbol(asyncId)]: 316,
[Symbol(triggerAsyncId)]: 0 }

而我想要做的是我拥有三个 API

  1. 加入请求
  2. 接受请求
  3. 拒绝请求

用户将加入请求发送到加入请求 api,然后我在数据库上维护一个数组,其中包含所有加入请求,然后管理员接受并拒绝来自该日志的请求,但我想要的是如果管理员不接受或拒绝请求在一段时间后被自动拒绝的请求

为了做这件事,我在加入请求 api 上运行 settimeout,如果管理员接受或拒绝请求,我清除 settimeout,如果它不接受或拒绝请求,则我的 settimeout 运行并自动拒绝该请求

但问题是,为了清除 settimeout,我需要 settimeout id,但我无法保存,请告诉我是否有任何方法可以实现这一点

提前致谢

【问题讨论】:

  • 我很确定还有另一种更好的方法可以做任何你想做的事情,而不需要将 setTimeout 的 id 存储在数据库中。
  • 你能给我任何建议或告诉我一些更好的方法吗
  • 我建议解释你的问题以及你想做什么。
  • 我在上面解释了我的问题,请给我一个方法来做到这一点
  • 不,您已经问过如何执行您已经决定的问题的解决方案。您尝试通过 API 启动和停止计时器肯定是有原因的,如果您解释了您尝试实现的基本目标,我们可以为您提供更好的帮助。

标签: javascript node.js mongodb settimeout


【解决方案1】:

用户将加入请求发送到加入请求 api,然后我在数据库上维护一个数组,其中包含所有加入请求,然后管理员接受并拒绝来自该日志的请求,但我想要的是如果管理员没有接受或拒绝请求在一段时间后自动拒绝的请求

这里您只需要在数据库中存储您的请求发生的时间戳。

为了做这件事,我在 join-request api 上运行 settimeout,如果管理员接受或拒绝请求,我清除 settimeout,如果它不接受或拒绝请求,则我的 settimeout 运行并拒绝该请求自动

那么你只需要管理那个时间戳。

如果不能向管理员显示用户请求,则仅在一段时间间隔内显示请求待处理。

如果必须向执行请求的用户显示请求状态,则通过用户的时间戳管理请求状态,拒绝超出置信区间的请求(这也可以通过管理员来完成。)

【讨论】:

  • +1 这也是我要推荐的。除此之外,您还可以将检查过期请求的进程拉到一个完全不同的进程中,可能由 cron 作业等管理,而不是尝试不断地检查 Web 应用程序内部。
【解决方案2】:

上述代码应该可以正常工作并且应该返回一个数字。但是,我认为将ID 存储在数据库中并不是一个好主意。即使我不知道您的确切用例,但我想您正在尝试做的是在实际超时发生之前clearTimeout。但是由于setTimeout 是一个运行时计时器,并且在应用程序退出其运行时时立即被终止,因此最好将ID 保留在运行时而不是数据库中,因为在您设置的n second 超时之后它将被废弃.

希望对你有帮助!!

【讨论】:

    【解决方案3】:

    timerId 只是一个数字。您可以将其直接存储到 MongoDB。

    【讨论】:

    • timerId 不是我控制它的数字,它返回一个对象
    • 你确定吗,因为我刚刚在 chrome 控制台上尝试了上面的代码,它只是吐出了一个数字
    • 它是一个数字,但是将它存储在数据库中是没有意义的。
    猜你喜欢
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 2020-10-17
    • 1970-01-01
    • 2017-02-23
    相关资源
    最近更新 更多