Тайм-ауты сервера обратной связи для одного определенного URL-адреса отдыха после «Необработанной ошибки для запроса POST» - PullRequest
0 голосов
/ 19 апреля 2019

Я определил один до создания ловушки на моем сервере обратной связи и попытался выполнить некоторую обработку ошибок.Бизнес-логика включает в себя то, что полученные параметры запроса (включая дату начала и окончания) не должны пересекаться с любыми интервалами дат, сохраненными в базе данных.В этом случае я выдаю ошибку.Но после выдачи ошибки все остальные запросы по этому URL-адресу просто прерываются.Хотя сервер продолжает отлично работать на других URL-адресах.

Unhandled error for request POST /api/MCarReservations: Error: Car is already reserved
    at C:\Fakultet\6. semestar\ISAMRS\Projekat\isamrs13\ahref-backend\common\models\m-car-reservation.js:53:35
    at notifyObserversAround.err (C:\Fakultet\6. semestar\ISAMRS\Projekat\isamrs13\ahref-backend\node_modules\loopback-datasource-juggler\lib\transaction.js:190:11)
    at C:\Fakultet\6. semestar\ISAMRS\Projekat\isamrs13\ahref-backend\node_modules\loopback-datasource-juggler\lib\observer.js:250:22
    at doNotify (C:\Fakultet\6. semestar\ISAMRS\Projekat\isamrs13\ahref-backend\node_modules\loopback-datasource-juggler\lib\observer.js:155:49)
    at Transaction.ObserverMixin._notifyBaseObservers (C:\Fakultet\6. semestar\ISAMRS\Projekat\isamrs13\ahref-backend\node_modules\loopback-datasource-juggler\lib\observer.js:178:5)
    at Transaction.ObserverMixin.notifyObserversOf (C:\Fakultet\6. semestar\ISAMRS\Projekat\isamrs13\ahref-backend\node_modules\loopback-datasource-juggler\lib\observer.js:153:8)
    at cbForWork (C:\Fakultet\6. semestar\ISAMRS\Projekat\isamrs13\ahref-backend\node_modules\loopback-datasource-juggler\lib\observer.js:240:14)
    at Query.callback (C:\Fakultet\6. semestar\ISAMRS\Projekat\isamrs13\ahref-backend\node_modules\loopback-connector-postgresql\lib\transaction.js:68:7)
    at Query.handleReadyForQuery (C:\Fakultet\6. semestar\ISAMRS\Projekat\isamrs13\ahref-backend\node_modules\pg\lib\query.js:125:10)
    at Connection.<anonymous> (C:\Fakultet\6. semestar\ISAMRS\Projekat\isamrs13\ahref-backend\node_modules\pg\lib\client.js:215:19)
    at Connection.emit (events.js:189:13)
    at Socket.<anonymous> (C:\Fakultet\6. semestar\ISAMRS\Projekat\isamrs13\ahref-backend\node_modules\pg\lib\connection.js:125:12)
    at Socket.emit (events.js:189:13)
    at addChunk (_stream_readable.js:284:12)
    at readableAddChunk (_stream_readable.js:265:11)
    at Socket.Readable.push (_stream_readable.js:220:10)

'use strict';


var flag = true;
// SQL car reservation before-hook
module.exports = function(Mcarreservation) {
  Mcarreservation.beforeRemote('create',
    function(ctx, model, next) {
      doReservation(Mcarreservation, ctx, model, next, function(e) {
        flag = false;
        next(e);
      });
    });
};

function doReservation(Mcarreservation, ctx, model, next, errorCallback) {
  // models
  var sqlCarReservation = Mcarreservation.app.models.CarReservation;
  var sCar = Mcarreservation.app.models.sCar;
  // data source
  var postgres = sCar.app.dataSources.postgres;
  // begin transaction
  sqlCarReservation.beginTransaction({
    isolationLevel: sqlCarReservation.Transaction.READ_COMMITTED,
  }, function(err, tx) {
    if (err) errorCallback(err);
    // lock car for update
    postgres.connector.execute(
      'SELECT * FROM sCar WHERE mongoId = $1 FOR UPDATE;'
      , [ctx.req.body.carId], function(err, data) {
        sCar.findOne({where: {mongoId: ctx.req.body.carId}}).then((car)=>{
          sqlCarReservation.find(
            {
              where: {sCarId: car.id},
            }).then((data)=> {
              data.forEach((element) => {
                if (flag) {
                  var start1 = element.startDate.getTime();
                  var end1 = element.endDate.getTime();
                  var start2 = ctx.req.body.startDate;
                  var end2 = ctx.req.body.endDate;
                  if ((start1 >= start2 && start1 <= end2) ||
                    (start2 >= start1 && start2 <= end1)) {
                    tx.rollback(function(err) {
                      if (err && flag) errorCallback(err);

                      var error = new Error('Car is already reserved');
                      error.statusCode = error.status = 404;
                      if (flag)
                        errorCallback(error);
                    });
                  }
                }
              });

              if (err && flag) {
                tx.rollback(function(err) {
                  if (err && flag) errorCallback(err);
                });
                errorCallback(err);
              }
              // fetch car from sql
              if (flag) {
                sCar.findOne({where: {mongoId: ctx.req.body.carId}})
                  .then((car)=>{
                    // create reservation
                    sqlCarReservation.create(
                      {
                        timeStamp: ctx.req.body.timeStamp,
                        sCar: car,
                        startDate: ctx.req.body.startDate,
                        endDate: ctx.req.body.endDate,
                      },
                      {transaction: tx},
                      function(err, cr) {
                        if (err && flag) {
                          tx.rollback(function(err) {
                            if (err && flag)  errorCallback(err);
                          });
                          errorCallback(err);
                        }
                        // commit and end before-hook
                        if (flag) {
                          tx.commit(function(err) {
                            if (err && flag)  errorCallback(err);
                            next();
                          });
                        }
                      });
                  });
              }
            });
        });
      });
  });
}

Я знаю, что код выглядит так, как будто его написал сам дьявол, и я очень надеюсь, что кто-то сможет его понять.Ожидаемый результат состоит в том, что сервер возвращает 404 с сообщением «Автомобиль уже зарезервирован», когда это происходит и продолжает работать.

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