How to determine return value is an error when using MVC?

Viewed 58

I was trying to separate the logic of my back-end server into route/controller/service, but one problem is when I try to catch error in service layer, I will return error, but how can I determine if it's error and return 404 status in my controller layer ?

Here's the code

Service layer

const register = async(name, email, password) => {
  const newUser = new User({
    username: name,
    email: email,
    password: CryptoJS.AES.encrypt(password, key).toString(),
  });

  try{
    const savedUser = await newUser.save();
    return savedUser
  } catch (err){
    return err 
  }
};

Controller layer

const register = (req,res) => {
    const { name, email, password } = req.body
    const user = UserService.register(name,email,password);
    
    if(how to determine here?){
       res.status(201).json(user);
    }
}
2 Answers

You could return an object in your Service Layer instead of an User or Error object:

const register = async(name, email, password) => {
  const newUser = new User({
    username: name,
    email: email,
    password: CryptoJS.AES.encrypt(password, key).toString(),
  });

  try{
    const savedUser = await newUser.save();
    return { user: savedUser, error: null }
  } catch (error){
    return { error, user: null }
  }
};

In your Controller Layer you would then do something like this:

const register = (req,res) => {
    const { name, email, password } = req.body
    const { user, error } = UserService.register(name,email,password);
    
    if(error){
       res.status(500).json({ user, error: error.message });
    } else {
       res.status(200).json({ user, error })
    }
}

return the save promise and handle errors in your controller

serivce:

const register = async(name, email, password) => {
  const newUser = new User({
    username: name,
    email: email,
    password: CryptoJS.AES.encrypt(password, key).toString(),
  });

  return newUser.save();
   
};

controller:

const register = async (req,res) => {
    const { name, email, password } = req.body
    try {
        const user = await UserService.register(name,email,password);
        res.status(201).json(user);
    } catch(error) {
      // handle error here
    }
    
}
Related