Home > OS >  How to create a database object using MongoDB with Next.js?
How to create a database object using MongoDB with Next.js?

Time:10-11

I followed this tutorial to set up MongoDB in my Next.js application: https://www.mongodb.com/developer/languages/javascript/nextjs-with-mongodb. In a file called mongodb-config.js, I have

import { MongoClient } from 'mongodb'

const uri = process.env.MONGODB_URI
const options = {
  useUnifiedTopology: true,
  useNewUrlParser: true,
}

let client;
let dbPromise;

if (!process.env.MONGODB_URI) {
  throw new Error('Please add your Mongo URI to .env.local')
}


// In production mode, it's best to not use a global variable.
client = new MongoClient(uri, options)
dbPromise = client.connect()


// Export a module-scoped MongoClient promise. By doing this in a
// separate module, the client can be shared across functions.

export default dbPromise

The above is how I configure my database.

When I need to use the database for my API, I do:

import dbPromise from "database/mongodb-config";

let db;
dbPromise.then((value) => {
    const client = value;
    db = client.db("database_name");
})
.catch((error)=>{
    console.error(error);
});

db will be the variable that links to my database.

Now, I want to simplify this process and put everything in one file.

In the portion where I set up dbPromise in mongodb-config.js, I initialize the DB variable and export it:

client = new MongoClient(uri, options)
dbPromise = client.connect()

let db;
dbPromise.then((value)=>{
    const client = value;
    db = client.db("datatbase_name");
})
.catch((error)=>{
  console.error(error);
});

export default db

I totally expect this to work. However, when I import db to another file and use it, the db is null. However, I waited until the dbPromise is resolved to pass db a value.

CodePudding user response:

Use await like this.

dbPromise = client.connect()

let db;
await dbPromise.then((value)=>{
    const client = value;
    db = client.db("datatbase_name");
})
.catch(error){
  console.error(error);
}

export default db

because mongoose is asynchronous so we have to use await before dbPromise otherwise export will be executed first before dbPromise.

CodePudding user response:

Try this, instead of returning db, return an async function, which you can all with await, in other parts to obtain, the connection to the database, the function will not try to make repeated connections, if they are already present:

let db, connection;
async function dbSetup() {
  try {
    if(!connection) {
       connection = await client.connect();
    }
    if(!db) {
       db = await connection.db("datatbase_name");
    }
    return db;
  } catch(error){
    console.error(error);
  }
}

export default dbSetup;
  • Related