2016-08-31 58 views
1

我使用的貓鼬用MongoDB的連接node.js的捕獲錯誤,現在我寫了下面的查詢當MongoDB的服務器宕機如何在運行貓鼬查詢

var trans = new transmodel({method: method, trans_id: r}); 
    trans.save(function(err) { 
     if (err) { 
      console.error("Razor_pay_webhook Error 4 err: " + err); 
      res.write('statusCode: 200'); 
      res.end(); 
    } else { 
     res.write('statusCode: 400'); 
     res.end(); 
    } 
    }); 

我想,當我的MongoDB集羣將下降那麼當執行上面的貓鼬查詢時,我會得到'err',但是當我運行上面的查詢時,當我的mongo集羣關閉時沒有任何事發生(沒有err被調用)。任何人都可以告訴我如果我的mongodb服務器停機在我的查詢內,我該如何捕獲錯誤。另外爲了重新與我的羣集重新連接,我設置了下面的參數,但是我的節點服務器沒有嘗試再次與我的MongoDB服務器重新連接,我不知道發生了什麼問題。

var mongoose = require('mongoose'); 
    var config = require('./config/database.js'); 
    var DB_URL = config.db.url; 

    mongoose.connection.on("connected", function(ref) { 
     console.log("Connected to " + " DB!"); 
    }); 

    mongoose.connection.on("error", function(err) { 
     console.error('Failed to connect to DB ' + ' on startup ', err); 
     if (err) { 
      return next(err); 
     } 
    }); 

    mongoose.connection.on('disconnected', function(err) { 
     console.log('Mongoose default connection to DB :' + ' disconnected'); 
     if (err) { 
      return next(err); 
     } 
    }); 

    var gracefulExit = function() { 
     mongoose.connection.close(function() { 
      console.log('Mongoose default connection with DB :' + ' is disconnected through app termination'); 
      process.exit(0); 
     }); 
    } 

    process.on('SIGINT', gracefulExit).on('SIGTERM', gracefulExit); 

    exports.con_close = function() { 
     console.log('Mongoose connection disconnected'); 
     mongoose.connection.close(); 
    } 

    var options = { 
     server: { 
      socketOptions: { 
       keepAlive: 1000, 
       connectTimeoutMS: 30000 
      } 
     }, 
     replset: { 
      rs_name: 'replicaset', 
      auto_reconnect:true, 
      socketOptions: { 
       keepAlive: 1000, // doubt about it 
       connectTimeoutMS: 30000 
      } 
     }, 
     user: 'root', 
     pass: 'G3saGT2Y', 
     auth: { 
      authdb: 'admin' 
     } 
    } 

    mongoose.connect(DB_URL, options, function(err) { 
     console.log('ho rha hai'); 
     if (err) { 
      console.log('error connection to mongo server!'); 
      console.log(err); 
     } 
    }); 
+0

您的應用程序是否開始掛起 - 未響應請求? –

回答

0

您正在使用貓鼬,它會在數據庫關閉時以及數據庫重新連接並重新啓動時發出事件(EventEmitter模式)。

從貓鼬代碼中發現here我們可以看到,該庫數據庫連接 - connection.js

有發射下列事件: * @參數{}貓鼬基地貓鼬實例 * @inherits的NodeJS EventEmitter

http://nodejs.org/api/events.html#events_class_events_eventemitter * @事件connecting:在此連接上執行connection.{open,openSet}()時發射。

  • @event connected:當此連接成功連接到數據庫時發出。可能會在reconnected的情況下發射倍數次。

  • @event open:在我們connectedonOpen之後發射,在所有這些連接模型上執行。

  • @event disconnecting:執行connection.close()時發出。

  • @event disconnected:從數據庫斷開連接後發射。

  • @event close:在我們對所有這些連接模型執行disconnectedonClose後發送。

  • @event reconnected:發送後我們connected和隨後disconnected,其次是成功的另一個成功的連接。

  • @event error:當此連接發生錯誤時發出。

  • @event fullsetup:在副本集場景中發射時,當主節點和 連接字符串中指定的至少一個後繼節點連接時。

  • @event all:在連接字符串中指定的所有節點都連接時,在副本集場景中發出。

當數據庫關閉您將收到兩個事件: 1.斷開 2.錯誤(該驅動程序遇到錯誤)

當數據庫再次,您將收到重新連接的事件。

因此,您不需要嘗試捕捉錯誤,而是應該聽取這些事件。

有關連接失敗和重新連接的更多有用信息,請參閱here

本文解釋如何根據您的設置使用和配置autoReconnect和bufferMaxEntries。