【问题标题】:How can I pass errors from Services to Controllers in Node.js?如何将错误从服务传递到 Node.js 中的控制器?
【发布时间】:2021-10-21 18:48:36
【问题描述】:

我正在尝试以一种有组织的方式进行身份验证,其中包含如下控制器和服务。尽管找到一种将错误消息从服务传递到控制器的方法一直很困难。用户已保存,但如果我想检查它,该电子邮件已经存在,则没有任何反应。

控制器:

const { isEmail, isEmpty } = require("../middleware/authMiddlewareValidators");
const { newUser } = require("../services/authServices");

// Register
exports.register = async (req, res) => {
  const { firstName, lastName, email, password } = req.body;

  if (isEmpty(email)) {
    res.status(400).json({ message: "Email must not be empty" });
    return;
  }
  if (!isEmail(email)) {
    res.status(400).json({ message: "Please provide a valid email adress" });
    return;
  }

  if (isEmpty(password)) {
    res.status(400).json({ message: "Password must not be empty" });
    return;
  }
  if (password.length < 6) {
    res
      .status(400)
      .json({ message: "Password must have at least 6 characters" });
    return;
  }

  try {
    await newUser(firstName, lastName, email, password)
    res.status(200).json({ message: "signup success! please login." });
  } catch (error) {
    console.log(error);
    res.status(500).json({message: error})
  }
};

服务:

const User = require("../models/User-model");
const bcrypt = require("bcryptjs");
const passport = require("passport");
const { transporter } = require("../configs/nodemailer");

exports.newUser = async (firstName, lastName, email, password) => {
  try {
    let user = await User.findOne({ email });
    
    if (user) {
      throw new Error("This email is already taken");
    } else {
      const salt = bcrypt.genSaltSync(10);
      const hashPass = bcrypt.hashSync(password, salt);

      const newUser = new User({
        firstName: firstName,
        lastName: lastName,
        email: email,
        password: hashPass,
      });

      newUser.save(() => {
        transporter.sendMail({
          to: newUser.email,
          from: process.env.SCHOOLSCOOL_EMAIL,
          subject: "Succefull register!",
          html: `<p>Welcome to School's Cool ${newUser.firstName} ${newUser.lastName}, <br>
                  <br> Please login to use the web application. <br><br> Thank you.</p>`,
        });
      });
    }
  } catch (error) {
    throw new Error(error.message);
  }
};

不确定我做错了什么,但如果用户已经存在,我无法传递消息...

【问题讨论】:

    标签: javascript node.js mongodb express mongoose


    【解决方案1】:

    你可以让服务返回一个对象:

    return {
      type: 'Error',
      message: err
    };
    

    如果没有错误,它将返回具有类型和消息的相同对象,如果有一些数据,您将把它放在同一个对象中,如下所示:

    return {
       type: 'Success',
       statusCode: 200,
       message: 'Users found successfully',
       users
    };
    

    然后您将使用对象破坏在控制器中接收这些数据:

    const {type, message, statusCode, users} = await userServices.getUsers();
    

    最后你可以检查类型是错误还是成功

    if (type === 'Error){
      return res.status(statusCode).json({type, message});
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-23
      • 1970-01-01
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多