-
-
Save mikberg/0a73b06533927fe717ba to your computer and use it in GitHub Desktop.
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); | |
} |
@Makmm - import
isn't in node yet, but i believe you can do:
const { MongoClient } = require('mongodb');
Hope this helps.
Does connecting with MongoClient normally not return a promise? Is this why I'm getting mPromise deprecation warnings when using Mongoose?
Thank you for show us how to do this! I'm trying to figure out if I should use Promisify when using Mongoose as well
Why did you not use promisify from the util library of nodejs?
@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;
}
Hey, I found this and it will probably help me a bunch!
But, with node v8, it errors at 'import'....
Do I need to use another version of node? A module?
If I need to do some babel-related stuff, I would probably prefer a babel-less approach.
Thanks! :)