node.js的本机mongodb连接

node.js的本机mongodb连接,node.js,mongodb,express,iis,Node.js,Mongodb,Express,Iis,我正在使用iisnode在IIS上运行node.js express应用程序,我遇到以下问题 我有一个mongo存储库的文件 var MongoClient = require('mongodb').MongoClient; var url = MY_URL; var db = null; MongoClient.connect(url, function(err, database) { db = database }) var repository = {}; reposito

我正在使用iisnode在IIS上运行node.js express应用程序,我遇到以下问题

我有一个mongo存储库的文件

var MongoClient = require('mongodb').MongoClient;
var url = MY_URL;
var db = null;

MongoClient.connect(url, function(err, database) {
    db = database
})

var repository = {};

repository.getAll = getAll;

module.exports = repository;

function getAll(collectionName)
{
    return new Promise(
        function(resolve, reject){
            db.collection(collectionName).find().toArray(function(err, res) {
                if (err) reject(err);
                resolve(res);
            });
    });
}
有时,当我试图从http get请求访问getAll函数时,我会遇到一个错误

"Cannot read property 'collection' of null"
这是因为db为null

但当我再次调用它时,它总是返回值

是否可能在设置连接之前激活了getAll功能? 或者第一个电话会以某种方式唤醒连接


我很难解决这个问题,因为我无法以可控的方式重现它。这通常发生在一段时间没有使用应用程序之后(似乎有时重新启动IIS也会触发它)。

MongoClient.connect
返回承诺。
getAll
也是如此

要确保在您尝试在那里查找内容时,db始终存在,您需要链接承诺。在几乎没有其他固定位的情况下,它可能是:

const MongoClient = require('mongodb').MongoClient;
const url = MY_URL;    
const dbConnected = MongoClient.connect(url); // it is a promise, db is not connected yet

function getAll(collectionName)
{
    return dbConnected.then(db => // the connection promise resolved, we are good to use db
        db.collection(collectionName).find().toArray() // it returns promise, no need to wrap it with another one
    );
}

module.exports = {getAll};

如果我在存储库中获得了更多此类函数,并且我在一行中发送了一些请求,比如getOne()-->deleteOne()-->getAll()。他们会使用第一个getOne()请求初始化的相同连接吗?我不确定我是否理解这个问题。你在问题中没有密切联系,所以我在答案中没有。如果您询问多个
db是否已连接。然后()
解析为同一个
db
实例,则是,它是同一个实例。如果您在某个地方关闭了它,您需要重新打开它,但这会使连接管理变得非常复杂,因为您无法取消承诺。