【问题标题】:How to determine return value is an error when using MVC?使用MVC时如何判断返回值是否出错?
【发布时间】:2025-12-07 07:20:05
【问题描述】:

我试图将后端服务器的逻辑分离到路由/控制器/服务中, 但是一个问题是当我尝试在服务层捕获错误时,我会返回错误,但是如何确定它是否是错误并在我的控制器层中返回 404 状态?

这是代码

服务层

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

控制器层

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

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    您可以在 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 { user: savedUser, error: null }
      } catch (error){
        return { error, user: null }
      }
    };
    

    在您的Controller Layer 中,您将执行以下操作:

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

    【讨论】:

    • 谢谢,真的是一个绝妙的处理方式。
    【解决方案2】:

    返回 save 承诺并处理控制器中的错误

    服务:

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

    控制器:

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

    【讨论】: