10

私はいくつかのエラー シナリオを経験し、それらの処理方法を理解しようとしています。

データベース接続がない場合、MongooseModel.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...
    });
 }
4

3 に答える 3

6

回答ではありませんが、解決の糸口になれば幸いです。パスポートモジュールの使用中にmongoose.createConnectionで非常によく似た問題が 発生し、 mongoose.connect で正常に動作することがわかりました

于 2012-12-12T23:47:32.620 に答える
4

接続呼び出しで既にエラー ハンドラーを使用しているため、賢明なことは、DB が起動していないときにアプリを終了するか、かなりの応答をするミドルウェアをアクティブにすることです500 Internal Server Error

Mongoose はnode-mongodb-native内部で mongodb への接続に使用します。そこには他の便利な接続オプションがあるかもしれません。:)

編集:設定してみてくださいsocketOptions.socketTimeoutMS。どうやらデフォルトのタイムアウトは設定されていません。http://mongodb.github.com/node-mongodb-native/api-generated/server.htmlを参照してください。

私の作業マシンには正確な構文を試すためのノードがありませんが、おそらく を使用する必要がありますmongoose.Connection。これには、open()に渡すオプションを受け入れるメソッドがありますnode-mongodb-nativemongoose.connect()これらのオプションを受け入れるとは思いませんが、間違っている可能性があります。

于 2012-07-23T12:42:19.450 に答える
0

この問題を解決するには、次の 3 つのタスクを実行する必要があります。

  1. options.db セクションで bufferMaxEntries:0 を構成します (詳細については、こちらを参照してください)。したがって、bufferMaxEntries を無効にすると、mongoose はバッファー コマンドを停止し、サーバーがダウンしたときにそれらの送信を再試行します。

  2. options.db セクションで autoReconnect:false を設定し、db レベルで autoReconnet を無効にします。(詳細はこちらをご覧ください)

  3. mongodb レプリカセットを使用している場合は、スキーマ レベルで (作成するスキーマごとに) bufferCommands を無効にする必要があります。

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

于 2016-12-12T17:19:38.057 に答える