【问题标题】:Mongoose request infinite hang猫鼬请求无限挂起
【发布时间】:2018-05-09 04:19:25
【问题描述】:

上下文

  • 猫鼬 v4.7.6
  • MongoDB v3.2.11

我正在尝试在我的软件中处理与我的数据库相关的错误。

我陷入了以下问题:当数据库断开连接时,猫鼬请求挂起,直到重新连接。


发生了什么事

  1. 我启动我的软件
  2. 它通过 mongoose 连接到数据库
  3. Ctrl+Cmongod进程
  4. 我从 mongoose 获得了 "Disconnect""Close" 事件
  5. 我发起 find(...) 请求
  6. 查找请求挂起

到目前为止我所做的尝试:

我尝试在我的架构中使用选项 bufferCommands,根据documentation,如果没有可用的连接,应该让猫鼬返回错误,但结果是一样的。


我的代码是什么?

   mongoose.createConnection(..., {
      server: {
        // We disable reconnect from mongoose
        auto_reconnect: false,

        socketOptions: {
          // For long running applictions it is often prudent to enable keepAlive.
          // Without it, after some period of time you may start to
          // see "connection closed" errors for what seems like no reason.
          // From mongoose documentation
          keepAlive: 1,
        },
      },
    })

【问题讨论】:

    标签: node.js mongodb mongoose mongoose-schema


    【解决方案1】:

    每当出现连接问题时,错误都会直接从猫鼬连接中抛出,您建立连接的主服务器以及根据您的需要有多种处理方法。

    您所做的查找查询专门针对最终使用主连接对象的架构。您必须为自己和用户以这种方式处理它,您必须为他们提出的请求配置超时并向他们发送适当的响应。

    基于超时取消请求

    这可以在多个级别上完成,您的服务器逻辑、客户端或猫鼬本身。

    按照这个人的回答来设置猫鼬超时,显然猫鼬没有正确记录。

    https://stackoverflow.com/a/32609226/5225363

    对于服务器的逻辑,您可以为特定请求创建一个系统,如果没有这个,则将响应发送回客户端并发送其他内容。

    在客户端上,如果在特定时间内没有收到响应,那么请确保存在一些问题。

    p.s 默认有请求超时设置

    【讨论】:

    • 感谢您回答我的问题。我不完全理解你的回答。所以我的查找查询使用架构,然后使用主连接对象。我该怎么做才能取消请求?谢谢
    • @GrégoryNEUT find 函数超时 - 这是我在答案中写的。如果您有一段时间没有收到对该特定请求的响应,请取消该请求。
    • 你知道如何取消发送给 mongoose 的请求吗?
    • 我在@GrégoryNEUT 的答案中更新了这个
    • 非常感谢。我确实阅读了您的更新。在猫鼬中设置超时的事情是,您不会区分需要时间的大请求和应该真正超时的请求。我宁愿让 bufferCommands 工作,因为它完全解决了我的问题。如果您能找到 bufferCommands 不起作用的原因,我将不胜感激。无论如何,我同意你的回答。
    猜你喜欢
    • 2020-02-01
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 2017-05-31
    • 2018-05-19
    • 2018-03-24
    • 1970-01-01
    相关资源
    最近更新 更多