Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Mongoose Model.find()在未连接到数据库时挂起_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js Mongoose Model.find()在未连接到数据库时挂起

Node.js Mongoose Model.find()在未连接到数据库时挂起,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我正在经历一些错误场景,试图了解如何处理这些错误 在没有数据库连接的情况下,MongooseModel.find(…)调用似乎挂起。下面是示例代码。我假设回调是通过err对象调用的,但事实并非如此 如何防止模型调用挂起?每次访问模型时是否必须手动检查readyState // app.js // Let's use a non-existing host so connecting fails: // (callback is invoked with err object) mongoose.

我正在经历一些错误场景,试图了解如何处理这些错误

在没有数据库连接的情况下,Mongoose
Model.find(…)
调用似乎挂起。下面是示例代码。我假设回调是通过
err
对象调用的,但事实并非如此

如何防止模型调用挂起?每次访问模型时是否必须手动检查
readyState

// app.js
// Let's use a non-existing host so connecting fails:
// (callback is invoked with err object)
mongoose.connect('mongodb://localhostXXX/blog', function(err){ ... });

BlogPost  = mongoose.model('BlogPost', BlogPostSchema);

// api.js
exports.list_posts = function(req, res) {

    // Ready state is '0' = disconnected (since we used a wrong hostname)   
    console.log('DB ready state: ' + BlogPost.db.readyState);

    // This will not invoke the callback:
    BlogPost.find(function(err, threads) {
        // Never called...
    });
 }

由于您已经在connect调用中使用了错误处理程序,因此明智的做法是在DB未启动时退出应用程序,或者激活一些中间件,这些中间件会以一个漂亮的
500内部服务器错误
响应

Mongoose在引擎盖下使用
节点mongodb native
连接mongodb,您可能会在其中找到其他有用的连接选项。:)

编辑:尝试设置
socketOptions.socketTimeoutMS
。显然没有默认的超时设置。看


我的工作机器上没有节点来为您测试确切的语法,但您可能必须使用
mongoose.Connection
,它有一个
open()
方法,该方法接受传递到
node mongodb native
的选项。我不认为
mongoose.connect()
接受这些选项,但我可能错了。

这不是答案,但希望它能帮助您找到解决方案。我和他有非常相似的问题 mongoose.createConnection 在使用passport模块时,发现它与
mongoose.connect

要解决此问题,您需要执行3项任务:

  • 在options.db部分中配置bufferMaxEntries:0(有关更多详细信息,请参阅) 因此,当禁用bufferMaxEntries时,这会导致mongoose停止缓冲区命令,并在服务器关闭时重试发送它们

  • 在options.db部分配置autoReconnect:false 在数据库级别禁用autoReconnet。(请参阅更多信息)

  • 如果使用mongodb replicaset,则需要在架构级别禁用BufferCommand(对于创建的每个架构)

    var schema=new schema({..},{bufferCommands:false})


  • 显示实现
    find
    方法的代码,您正在调用
    BlogPost
    @ebohlman
    BlogPost
    是一个mongoose模型(我更新了代码)。如果服务器启动后数据库关闭,情况如何?初始连接将成功,但以后对
    find()
    的调用不会如我前面所述阻塞吗?我已经做了更多的研究,请参见编辑。但是,在我稍后可以测试你的问题之前,请不要把这个放在心上据我所知,mongo/mongoose正在缓冲
    find
    ,直到db重新连接。我相信默认选项它会尝试自动重新连接。在特定的OP示例中,您需要检查您是否有有效的初始连接。如果可以的话,我会给它一个+100。我已经试着解决这个问题好几个小时了。非常感谢。多年来我都不可能弄清楚。这就解释了区别。我刚刚提交了一个问题