简体   繁体   中英

Why is there no message in mongoose error object?

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": "pranatkarode@rocketmail.com"
 }
}

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
        })
    }
})
}

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.

I would suggest to wrap an await/async try/catch block to your method and to check if you are getting anything from req.body before trying to save to the database:

    exports.signUp = async (req,res)=>{
      try { 
        const user=new User(req.body);
        if (!user) throw new Error("Your message ...");
        user.save();
        // res.status(201).json(user);
      } catch {
        res.status(422).json({ message: err.message ?? err });
      }
    }

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 ur.env file and make sure they are correct, also you should make sure ur ip address is set to both 0.0.0.0 and ur current ip in the atlas. before = await user.save(); after = user.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM