node.js的本机mongodb连接
我正在使用iisnode在IIS上运行node.js express应用程序,我遇到以下问题 我有一个mongo存储库的文件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
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
实例,则是,它是同一个实例。如果您在某个地方关闭了它,您需要重新打开它,但这会使连接管理变得非常复杂,因为您无法取消承诺。