Home > Software engineering >  How to save in Mongoose with await?
How to save in Mongoose with await?

Time:09-27

The below code works, but I would like to only use async/await, so my question is ´: How can I turn

cat.save().then(() => console.log('Saved in db'));

into using await instead?

The reason I have mongoose.connection.once() is to only send commands when MongoDB is connected. if this could use await as well, then it would be really great =)

import mongoose from 'mongoose';
import { connectDb } from './modules/connectDb';
const { Schema } = mongoose;
const catSchema = new Schema({ name: String });
    
(async () => {
  connectDb('testDB');

  mongoose.connection.once('open', () => {
    console.log('MongoDB is connected');

    mongoose.connection.db.listCollections().toArray(function (err, names) {
      console.log(names);
    });

    const catModel = mongoose.model('testColl', catSchema);

    const cat = new catModel({ name: 'Zildjian' });
    cat.save().then(() => console.log('Saved in db'));
  });
})();

connectDb.ts

import mongoose from 'mongoose';
import { strict as assert } from 'assert';
import { readToml } from './readToml';

const db = readToml('./config/database.toml');

export function connectDb(
  database: string = db.database,
  uri: string = db.uri,
  username: string = db.username,
  password: string = db.password,
) {
  assert(typeof uri === 'string');
  assert(typeof database === 'string');
  assert(typeof username === 'string');
  assert(typeof password === 'string');

  const URI = `mongodb srv://${username}:${password}@${uri}/${database}?retryWrites=true&w=majority`;

  try {
    mongoose.connect(URI);
  } catch (err) {
    console.error(err);
  }
}

CodePudding user response:

In order to use await you have to provide a promise to await for. cat.save() returns a promise, so this should work. Nevertheless you can also only use await in async function, so you should also declare the callback function for the open event as async:

(async () => {
  connectDb('testDB');

  mongoose.connection.once('open', async () => {
    console.log('MongoDB is connected');

    mongoose.connection.db.listCollections().toArray(function (err, names) {
      console.log(names);
    });

    const catModel = mongoose.model('testColl', catSchema);

    const cat = new catModel({ name: 'Zildjian' });
    await cat.save();
    console.log('Saved in db');
  });
})();

CodePudding user response:

Try below code and make sure the function contains await keyword should always async function (async keyword should be used before function name)

try {
const catModel = mongoose.model('testColl', catSchema);
const cat = new catModel({ name: 'Zildjian' });
const response = await cat.save(); // if error while saving, catch will get executed
console.log(response); // saved record
} catch (err) {
  console.log('err'   err);
  // return error response
}
  • Related