Всегда ли ошибка должна быть отклонена обещанием? Express обработка исключений маршрута - PullRequest
1 голос
/ 07 марта 2020

У меня есть следующий маршрут, который получает некоторые данные и затем сохраняет их в mon go db

код маршрутизатора

router.post('/addPatient',async (req,res)=>{
    let response = await patientRepo.addUser(req.body);
    res.send(response);
});

код хранилища

addUser = function(patientData){
    return new Promise((resolve,reject)=>{
        openDbConn().then((db)=>{
            let patient = new Patient(patientData);
            patient.save()
            .then(item=>  resolve(status.STATUS_CODES.PATIENT_SAVE_SUCCESS))
            .catch(err => resolve(status.STATUS_CODES.PATIENT_SAVE_FAILED))  /*see this line*/
            .finally(()=> db.close());
        }).catch(dbErr=> resolve(dbErr));    
    });
}

Что я я делаю, я всегда разрешаю обещание от функции addUser, даже если это не удается. Потому что, если я отклоню обещание, то в моем файле маршрутизатора я должен изменить код маршрута, как показано ниже, для обработки отклоненного обещания,

router.post('/addPatient',async (req,res,next)=>{
  try{
      let response = await patientRepo.addUser(req.body);
      res.send(response);
   }catch(err){
      next(err); /**This sends an html response generated by server for the error**/
   }
 });

Сценарий состоит в том, что я хочу отправить свои пользовательские коды на если клиент в случае какого-либо исключения, но при отклонении обещания сервер отвечает настраиваемой страницей html для внутренней ошибки сервера 500. Но при разрешении я могу передать описание ошибки и код и, следовательно, для маршрутизатора не требуется перехват попытки код.

Так что, с этим подходом можно go. Это условно? или хорошо?

Ответы [ 2 ]

1 голос
/ 07 марта 2020

В вашем приложении могут возникнуть 2 вида ошибок:

  1. Ошибка из-за некоторых спецификаций приложения c logi c
  2. Ошибка, возникшая на сервере сама (ошибка БД, файл не найден, и т. д. c.)

Я хотел бы предложить, чтобы 1-й тип ошибки не возвращал HTTP-код, отличный от 200, так как в этом нет ничего плохого с вашим сервером. Второй должен вернуть соответствующий код, например 400, 500, 404 и т. Д. c.

Надеюсь, это поможет.

1 голос
/ 07 марта 2020

На этот вопрос есть достойный ответ, с которым я согласен:

По сути, если клиент (UI) знает, что ему нужно копаться в ответе, независимо от того, что это 200 OK, чтобы потенциально выкопать код ошибки и / или условие, то это вполне законно.

Альтернативой может быть не использовать функциональность next, которая автоматически передает ошибку, а вручную установить код ошибки, а затем просто вернуть JSON, который вы хотите в объекте ответа , В этом случае вы будете использовать HTTP-коды состояния «надлежащим образом», одновременно предоставляя объект ошибки, который должен использовать клиент.

router.post('/addPatient',async (req,res,next)=> {
  try{
      let response = await patientRepo.addUser(req.body);
      res.send(response);
   }catch(err){
      res.statusCode = 400;
      res.send(err);
   }
 });

При этом вам нужно будет reject в вашем catch операторов, чтобы они могли проходить, конечно.

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