skip to Main Content

I am making a user signup API, where name and email are set to be unique. When I send a JSON object which has a the same email address as an existing user, it gives an error as expected.
But there is no message in that error, which i can then use to give a more usable message.

Below is the error object that i’m getting.

{ "index": 0,    
 "code": 11000,
 "keyPattern": {
    "email": 1
},
 "keyValue": {
    "email": "[email protected]"
 }
}

And this is my controller module,

const User=require("../models/userModels.js");
exports.signUp=(req,res)=>{
const user=new User(req.body);
user.save((err,user)=>{
    if(err){
        res.send(err)
    }
    else{
        res.json({
            user
        })
    }
})
}

2

Answers


  1. Mongoose’s default error object is designed for non limited use cases. So you need to look at it and depending on what it contains add custom messages. For this specific use case of yours, you can for example do it like so:

    const User = require("../models/userModels.js");
    exports.signUp = async (req, res) => {
      try {
        const user = new User(req.body);
        await user.save();
        res.json({
          user,
        });
      } catch (err) {
        if (err.code === 11000 && err?.keyPattern.hasOwnProperty("email")) {
          err.message = "This email is alrady used.";
        } else if (err.code === 11000 && err?.keyPattern.hasOwnProperty("name")) {
          err.message = "This name is alrady taken.";
        }
        res.send(err);
      }
    };
    

    I’m using async/await syntax here to have a better looking code, yours would work as well.

    Login or Signup to reply.
  2. The solution is quite simple, just remove the await before the await user.save and boom everything should be fine… but if problem persist then check your username and password in your .env file and make sure they are correct, also you should make sure your IP address is set to both 0.0.0.0 and your current IP in the atlas.

    Before:

    await user.save();
    

    After:

    user
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search