首页 > 解决方案 > 如何从控制器中提取成功和错误响应

问题描述

我正在使用 nodejs、mongodb 和 express 创建 rest api。在每个成功响应和错误响应中,我都以自定义格式发送这些响应。但是这种格式是重复的,并且在每个 if else 和 try catch 块中我一遍又一遍地重复,控制器变得噪音和不可读。

我想在中央某处分离/提取该逻辑,例如将来如果我需要对该格式进行任何更改,我不需要在多个地方进行修改。请在下面找到登录功能。

**身份验证控制器 - **

    var api_var = {
      version: process.env.API_VERSION,
      developer: process.env.API_DEVELOPER
    };


    exports.login = async (req, res) => {
      var response_status = {};
      var response_dataset = {};
      var response_data = {};

      const errors = validationResult(req);

      try {
        if (!errors.isEmpty()) {
          const errorVal = errors.array();
          response_dataset = errors.array();
          response_status.message = errorVal[0].msg;
          response_data.dataset = response_dataset;
          (response_data.status = response_status), (response_data.publish = api_var);

          res.status(process.env.HTTP_RESPONSE_BAD_REQUEST);
          res.send({ response: response_data });
        } else {
          let { email, password } = req.body;
          let user = await User.findOne({ email });

          if(!user){
            response_status.message = "There is no user associated with this email address!";
            response_data.dataset = response_dataset;
            (response_data.status = response_status),
            (response_data.publish = api_var);

            res.status(process.env.HTTP_RESPONSE_UNAUTHORIZED);
            res.send({ response: response_data });
          } else if (user.status == 'inactive'){
            response_status.message = "Your Account is either disabled or removed!";
            response_data.dataset = response_dataset;
            (response_data.status = response_status),
            (response_data.publish = api_var);

            res.status(process.env.HTTP_RESPONSE_UNAUTHORIZED);
            res.send({ response: response_data });
          } else if(!global.Helpers.comparePassword(password, user.password)){
            response_status.message = "The password is invalid or the user does not have a password!";
            response_data.dataset = response_dataset;
            (response_data.status = response_status),
            (response_data.publish = api_var);

            res.status(process.env.HTTP_RESPONSE_UNAUTHORIZED);
            res.send({ response: response_data });
          }else if(user.isVerified == false){
            response_status.message = "Your Account is not varified. Please verify your Account!";
            response_data.dataset = response_dataset;
            (response_data.status = response_status),
            (response_data.publish = api_var);

            res.status(process.env.HTTP_RESPONSE_UNAUTHORIZED);
            res.send({ response: response_data });
          } else {
            let userDetails = {
              id: user._id,
              email: user.email,
              name: user.name,
              role: user.role
            };
            let Token = global.Helpers.createToken(userDetails);
            user_details = {
              token : Token,
              user : {
                role: user.role,
                name: user.name,
                email: user.email,
                _id: user._id
              }
            }
            response_status.message = "Well Done, You Successfully Logged In to pawsticks!";
            response_data.dataset = user_details;
            (response_data.status = response_status),
            (response_data.publish = api_var);

            res.status(process.env.HTTP_RESPONSE_OK);
            res.send({ response: response_data });
          }
        }
      } catch (error) {
        response_dataset = error;
        response_status.message = error.message;
        response_data.dataset = response_dataset;
        (response_data.status = response_status), (response_data.publish = api_var);

        res.status(process.env.HTTP_RESPONSE_INTERNAL_SERVER_ERROR);
        res.send({ response: response_data });
      }
    }

在我当前的实现中,api_var 对象和 response_status、response_dataset、response_data 是重复的。我怎样才能清理这个烂摊子。

标签: node.jsexpress

解决方案


您可以抛出自定义错误并在错误中间件中捕获,从那里您可以返回相同的逻辑。错误响应。

基本样本

const express = require("express");
const app = express();
class ResponseError {
  constructor(status) {
    this.status = status;
  }
}
function resError(err, req, res, next) {
  if(err instanceof ResponseError) {
    // Logic here
    res.status(400).send('Logic break')
  }else {
    res.status(500).send('Something broke!')
  }
}
app.route("/book/:id").get(function(req, res) {
  if (req.params.id == 2) throw new ResponseError(400);
  console.log(req.params);
  res.send("Get a random book");
});

app.route("/user/:id").get(function(req, res) {
  if (req.params.id == 2) throw new ResponseError(400);
  console.log(req.params);
  res.send("USER");
});
app.use(resError)
app.listen(3000);

更多信息: https ://expressjs.com/en/guide/error-handling.html


推荐阅读