Last active
December 29, 2021 16:57
-
-
Save mikberg/0a73b06533927fe717ba to your computer and use it in GitHub Desktop.
MongoDB connection with async/await
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { MongoClient } from 'mongodb'; | |
import promisify from 'es6-promisify'; | |
let _connection; | |
const connect = () => { | |
if (!process.env.MONGO_CONNECTION_STRING) { | |
throw new Error(`Environment variable MONGO_CONNECTION_STRING must be set to use API.`); | |
} | |
return promisify(MongoClient.connect)(process.env.MONGO_CONNECTION_STRING); | |
}; | |
/** | |
* Returns a promise of a `db` object. Subsequent calls to this function returns | |
* the **same** promise, so it can be called any number of times without setting | |
* up a new connection every time. | |
*/ | |
const connection = () => { | |
if (!_connection) { | |
_connection = connect(); | |
} | |
return _connection; | |
}; | |
export default connection; | |
/** | |
* Returns a ready-to-use `collection` object from MongoDB. | |
* | |
* Usage: | |
* | |
* (await getCollection('users')).find().toArray().then( ... ) | |
*/ | |
export async function getCollection(collectionName) { | |
const db = await connection(); | |
return db.collection(collectionName); | |
} |
@buoyantair promisify was not available before node 8
This really helped. BTW I had a following error on L38 (getCollection
):
TypeError: db.collection is not a function
I used MONGO_CONNECTION_STRING
value with database name at the end of URI, but didn't work.
So I edited a little like followings and it worked:
export async function getCollection(collectionName) {
const db = (await connection()).db(YOUR_DATABASE_NAME);
return db.collection(collectionName);
}
And no need to make schema because this is why mongo is used for unstructured database storage.
const MongoClient = require('mongodb').MongoClient
require('dotenv').config({ path: `${__dirname}/.env` })
module.exports = async () => {
let db;
try {
// Build the connection String and create the database connection
const client = await MongoClient.connect(
`mongodb://${process.env.DB_HOST}/${process.env.DB_NAME}`,
{
useNewUrlParser: true
}
)
// db global variable
db = await Client.db(process.env.DB_NAME)
}
catch (err) {
return console.log('Database Connection Error!', err.message)
}
return db;
}
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Why did you not use promisify from the util library of nodejs?