2017-09-14 63 views
0

我的app.js如下所示。当新的请求进入时,mogoDBUtils.getMogoDbCon();将打开数据库连接。我想在api调用route.js结束后立即关闭数据库连接。在API调用期间打开和关闭数据库连接

我需要在app.js中放置代码以关闭下面的代码中的MongoDB连接,以便在evey新命中时打开连接并在api调用完成后关闭连接。

var express = require('express'); 
var bodyParser = require('body-parser'); 

var app = express(); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.disable('x-powered-by') 
var mogoDBUtils = require('./controller/utilities/mongodbutils.js') 
var logger = require('./controller/utilities/logger.js'); //initialize logger class 

require('./routes/route.js')(app); //define express router for api calls 
mogoDBUtils.getMogoDbCon(); //open dbconnection 

//setup server 
var port = process.env.PORT || 80 // port 

app.use(express.static('./views/webcontent/', { index: 'index.html' }))//define home page 

app.listen(port); 
console.log('Listening on port ' + port + '..'); 

// DB函数

module.exports.getMogoDbCon = function() { 
    new Promise((resolve, reject) => { 
    var mongoUri = getmongouri(); 
    mongoose.connection.openUri(mongoUri); 
    var db = mongoose.connection; 

    db.on('error', function() { 
     throw new Error('unable to connect to database'); 
    });  
    return resolve(db); 
    }); 
}; 

module.exports.closeMongoDBConnection = function() { 
    new Promise((resolve, reject) => { 
    mongoose.disconnect(); 
    return resolve(true); 
    }); 
}; 

回答

0

您可以在中间件做到这一点。如果你要打开和每个请求紧密的联系,你需要创建两个中间件:打开连接,并关闭它:

我想这getMogoDbCon()closeMogoDbCon返回一个承诺,否则使用回调。

app.use((req, res, next) => { 
    mogoDBUtils 
    .getMogoDbCon() 
    .then(conn => { 
     req.conn = conn; 
     next(); 
    }) 
    .catch(next); 
}); 

require('./routes/route.js')(app); // define express router for api calls 

app.use((req, res, next) => { 
    mogoDBUtils 
    .closeMogoDbCon(req.conn) 
    .then((() => next()) 
    .catch(next); 
}); 

备注中间件秩序宣言。打开连接的中间件必须首先定义,然后是所有路由,最后一个 - 关闭连接的中间件。

+0

我已经添加getMogoDbCon()和closeMogoDbCon在问题的代码中使用。我得到一个错误TypeError:无法读取第二个中间件未定义的属性'然后'关闭连接。请你帮忙。 –

+0

在这两个函数中添加'return'语句:'return new Promise(...' – alexmac

+0

连接没有关闭。不知道我的代码有什么问题 –