-
-
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! :)