Как извлечь успешные и ошибочные ответы из контроллеров - PullRequest
0 голосов
/ 26 марта 2020

Я создаю остальные API, используя nodejs, mongodb и express. И в каждом успешном ответе и ответе об ошибке я отправляю эти ответы в произвольном формате. Но этот формат повторяется, и в каждом случае, если еще и попробуйте блок перехвата, я повторяю это снова и снова, и контроллер становится шумным и нечитаемым.

Я хочу отделить / извлечь эту логику c где-то в центре, как в будущем, если мне нужно будет внести какие-либо изменения в этот формат, мне не нужно вносить изменения в нескольких местах. Ниже приведена функция входа в систему.

** Контроллер аутентификации - **

    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 являются повторяющимися. Как я могу быть в состоянии убрать этот беспорядок.

1 Ответ

0 голосов
/ 26 марта 2020

Вы можете выдать пользовательскую ошибку и поймать в промежуточном программном обеспечении ошибки, оттуда вы можете вернуть те же логы c. сообщение об ошибке.

Basi c sample

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...