Search code examples
node.jsmongodbexpressmongoosemongoose-schema

How to show Errors from Mongoose?


I have a user I can save in MongoDB, when I enter correct data, the save works.

But when I enter wrong data, I can't catch the errors to be seen for the user. All I can see is this on the code editor:

...UnhandledPromiseRejectionWarning: ValidationError: User validation failed: username: username is not there!...

This error "kills" the server, and so I'm not rendering home-guest template.

The question is how I can catch the errors and show them to the user?

Schema:

const mongoose = require("mongoose")

const userSchema = new mongoose.Schema({
  username: {
    type: String,
    required: [true, "username is not there!"],
    minlength: 3,
    maxlength: 20,
  },
  email: {
    type: String,
    required: true,
  },
  password: {
    type: String,
    required: true,
    minlength: 6,
    maxlength: 20,
  },
})

module.exports = mongoose.model("User", userSchema)

Controller:

const mongoose = require("mongoose")
const userModel = require("../models/userModel")

exports.signUp = async (req, res) => {
  const { username, email, password } = req.body
  try {
    const user = await new userModel({
      username,
      email,
      password,
    })
    user.save()
  } catch (error) {
    res.render("home-guest", { error })
  }
}

Solution

  • You just need to add an await to the save operation, since that's also async:

    const mongoose = require("mongoose")
    const userModel = require("../models/userModel")
    
    exports.signUp = async (req, res) => {
      const { username, email, password } = req.body
      try {
        const user = await new userModel({
          username,
          email,
          password,
        })
        // Wait for the save to complete, also allowing you to catch errors
        await user.save()
      } catch (error) {
        res.render("home-guest", { error })
      }
    }
    

    EDIT: And note that you do not need an async in front of new userModel(). new cannot return a promise, it is always synchronous.