koa-mongo-router
Version:
KOA REST API Router for MongoDB
126 lines (125 loc) • 4.21 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.closeDatabases = exports.getDatabaseCollection = exports.getDatabase = exports.getMongoClient = exports.resetMongoClient = exports.setMongoClientOptions = void 0;
const mongodb_1 = require("mongodb");
const node_server_utils_1 = require("node-server-utils");
let mongoConnectionString = 'mongodb://localhost:27017';
if (process.env.MONGO_CONNECTION_STRING != undefined) {
mongoConnectionString = process.env.MONGO_CONNECTION_STRING;
}
let mongoClientPromise;
let mongoClientOptions = {
ignoreUndefined: true,
// bufferMaxEntries: 0,
useNewUrlParser: true,
// reconnectTries: Number.MAX_VALUE,
useUnifiedTopology: true,
};
function setMongoClientOptions(options) {
if (options != undefined) {
mongoClientOptions = Object.assign(Object.assign({}, mongoClientOptions), options);
}
resetMongoClient();
}
exports.setMongoClientOptions = setMongoClientOptions;
function resetMongoClient() {
mongoClientPromise = undefined;
databases = {};
}
exports.resetMongoClient = resetMongoClient;
function getMongoClient(createConnection = true, options) {
if (mongoClientPromise == undefined) {
/* istanbul ignore next */
if (!createConnection) {
return Promise.reject(new Error('No connection'));
}
setMongoClientOptions(options);
mongoClientPromise = mongodb_1.MongoClient.connect(mongoConnectionString, mongoClientOptions).catch(
/* istanbul ignore next */
(err) => {
resetMongoClient();
throw err;
});
}
return mongoClientPromise;
}
exports.getMongoClient = getMongoClient;
let databases = {};
async function getDatabase(databaseName) {
const mongoClient = await getMongoClient();
const db = mongoClient.db(databaseName);
if (databases[databaseName] === db) {
return db;
}
databases[databaseName] = db;
node_server_utils_1.logger.debug({
message: 'database connected',
database: db.databaseName,
});
db.on('error',
/* istanbul ignore next */
(mongoError) => {
node_server_utils_1.logger.error({
message: 'database error',
database: db.databaseName,
error: mongoError != undefined ? mongoError.message : undefined,
});
})
.on('parseError',
/* istanbul ignore next */
(mongoError) => {
node_server_utils_1.logger.error({
message: 'database parseError',
database: db.databaseName,
error: mongoError != undefined ? mongoError.message : undefined,
});
})
.on('timeout',
/* istanbul ignore next */
(mongoError) => {
node_server_utils_1.logger.error({
message: 'database timeout',
database: db.databaseName,
error: mongoError != undefined ? mongoError.message : undefined,
});
})
.on('close',
/* istanbul ignore next */
(mongoError) => {
node_server_utils_1.logger.debug({
message: 'database closed',
database: db.databaseName,
error: mongoError != undefined ? mongoError.message : undefined,
});
})
.on('reconnect',
/* istanbul ignore next */
() => {
node_server_utils_1.logger.info({ message: 'database reconnect', database: db.databaseName });
})
.on('fullsetup',
/* istanbul ignore next */
() => {
node_server_utils_1.logger.info({
message: 'database full setup',
database: db.databaseName,
});
});
return db;
}
exports.getDatabase = getDatabase;
async function getDatabaseCollection(databaseName, collectionName) {
const database = await getDatabase(databaseName);
return database.collection(collectionName);
}
exports.getDatabaseCollection = getDatabaseCollection;
/* istanbul ignore next */
async function closeDatabases(force = false) {
try {
const mongoClient = await getMongoClient(false);
await mongoClient.close(force);
}
catch (err) {
/* do nothing */
}
}
exports.closeDatabases = closeDatabases;