NodeJS Mongoose处理数据库连接失败异常

时间:2017-04-27 07:21:43

标签: node.js database exception mongoose handle

我正在使用NodeJS构建一个restful web服务api。它使用Mongoose作为ODM并使用MongoDB作为后端。 下面我将解释我的情景

我启动了nodejs服务器 之后我关闭了MongoDB数据库。 然后调用GET api调用,它会捕获任何错误,并且api调用会挂起。

main.js文件中的数据库配置

var mongoose = require('mongoose');
var uri = 'mongodb://localhost/mydb';
mongoose.Promise = global.Promise;
var options = { server: {socketOptions: { keepAlive: 300000, connectTimeoutMS: 10000 } } } ;
mongoose.connect(uri,options);
var db = mongoose.connection;
db.on('error',console.log.bind(console,'connection refused !!!!!'));
db.once('open', console.log.bind(console,'connection success !!!!!'));

这是我的基本GET电话

 var express = require('express');
    var router = express.Router();
    var mongoose = require('mongoose');
    var rootRes = require('../model/rootresources.js');

    router.get('/', function(req, res, next) {
      rootRes.find({},function (err, rootResource) {
    if (err){
     console.log('Error occurd !!!') }
    res.json(rootResource);
});
});

即使数据库连接失败,代码也不会进入错误块。因此,当API调用中的数据库连接失败时,没有捕获数据库拒绝。

我想捕获该错误并将内部服务器错误(代码:500)发送到客户端。我试图找到解决方案,但仍然无法找到它 任何解决方案或我是否犯了错误?

谢谢 Amila

2 个答案:

答案 0 :(得分:1)

您是否将这两部分代码放在同一个文件(即.main.js)或两个不同的文件中。

将它们放在同一个文件中,运行node main.js会抛出异常。

// main.js
var mongoose = require('mongoose');
var uri = 'mongodb://localhost/mydb';
mongoose.Promise = global.Promise;
var options = { server: {socketOptions: { keepAlive: 300000, 
connectTimeoutMS: 10000 } } } ;
mongoose.connect(uri,options);
var db = mongoose.connection;
db.on('error',console.log.bind(console,'connection refused !!!!!'));
db.once('open', console.log.bind(console,'connection success !!!!!'));

var express = require('express');
var router = express.Router();
var mongoose = require('mongoose');
var rootRes = require('../model/rootresources.js');

router.get('/', function(req, res, next) {
  rootRes.find({},function (err, rootResource) {
  if (err){
    console.log('Error occurd !!!') }
  res.json(rootResource);
  });
});

例外情况是:

connection refused !!!!! { MongoError: failed to connect to server [localhost:27017] on first connect [MongoError: connect ECONNREFUSED 127.0.0.1:27017]
etc...

因此,我想您可能会将express的代码放在index.js这样的文件中,并将代码mongoose connection放在另一个文件中。然后在命令行中运行node index.js。虽然在index.js中运行代码不会在其他文件中包含代码,但main.js中的代码将不会被执行。结果,没有错误信息。

<强>更新 我知道两种方法:

1.在main.js中创建与数据库建立连接并创建 db 实例的函数,以便您可以在主代码中调用它。

// main.js like this
var mongoose = require('mongoose');
function createConnection(url) {
  mongoose.connect(url,options);
  var db = mongoose.connection;
  db.on('error',console.log.bind(console,'refused !!!!!'));
  db.once('open', console.log.bind(console,'success !!!!!'));
  return db;
}
// export function
module.exports = createConnection;

// in your index.js 
var createConnection = require('./main.js');
var db = createConnection(url);
// other codes here

2.使用requirevm编译并运行javascipt代码。您可以找到vm api详细信息here

//main.js
var mongoose = require('mongoose');
var uri = 'mongodb://localhost/mydb';
mongoose.Promise = global.Promise;
var options = { server: {socketOptions: { keepAlive: 300000, 
connectTimeoutMS: 10000 } } } ;
mongoose.connect(uri,options);
var db = mongoose.connection;
db.on('error',console.log.bind(console,'connection refused !!!!!'));
db.once('open', console.log.bind(console,'connection success !!!!!'));

// index.js
// require will load file and execute automaticly
var scriptSrc = require('./main');
// other codes here

您可以将第二种方式视为使用eval('var mongoose = require('mongoose'); var uri = 'mongodb://localhost/mydb'; etc...

答案 1 :(得分:0)

猫鼬连接不会发生,除非您遇到请求。因此最好在您的第一个请求中间件中进行处理。参见下面的代码洞察力。

module.exports = function () {

return function (req, res, next) {

            mongoose.connect(URL, MONGO_OPTIONS);
            mongoose.connection
                .once('open', () => { })
                .on('error', (error) => {
                     res.status(401).json({});
                });
...

然后将上面的中间件传递给您的路由器:如果需要更多说明,请告诉我

router.get('/', myMiddleware(){})