olhapi
@olhapi
front-end

Как побороть вагон if'ов?

Пишу чатбота на nodejs, есть несколько наборов данных которые он собирает через webhook но все они относятся к одной теме - перевозки. Соответственно в БД есть модель - перевозки, которая включает в себя все поля из разных типов перевозок (грузовые, легковые и тп).

Получается что когда приходят данные для легковой перевозки, в ней нет данных, необходимых для грузовой, и наоборот. Думаю на сервере просто проверяю есть ли такой-то параметр и если нету то его не записываю в объект, который потом сохраняется в БД. Вагон if'ов, но по другому не придумал как сделать, имена параметров могут не совпадать с теми что приходят. Правда в этом случае получаю ошибку "Unhandled error for request POST /webhook/: TypeError: Cannot read property 'startTime' of undefined" из условия одного из if'ов.

Почему оно не преобразовывает его в FALSE? Как исправить и может есть идеи как это получше организовать? Понимаю что коряво, но что с этим делать ума не приложу.

const transportationData = {
    employeeId: req.body.originalDetectIntentRequest
      .payload.data.userProfile.id,
    'created-date': todayDate.toISOString(),
    'request-status': 'обрабатывается',
    'transportation-type': req.body
      .queryResult.parameters['transportation-type'],
  };

  if (req.body.queryResult.parameters['places-count']) {
    transportationData['places-count'] = req.body.queryResult
      .parameters['places-count'];
  }

  if (req.body.queryResult.parameters['contact-person']) {
    transportationData['contact-person'] = req.body.queryResult
      .parameters['contact-person'];
  }

  if (req.body.queryResult.parameters['stowing-type']) {
    transportationData['stowing-type'] = req.body.queryResult
      .parameters['stowing-type'];
  }

  if (req.body.queryResult.parameters['cargo-type']) {
    transportationData['cargo-type'] = req.body.queryResult
      .parameters['cargo-type'];
  }

  if (req.body.queryResult.parameters['unloading-type']) {
    transportationData['unloading-type'] = req.body.queryResult
      .parameters['unloading-type'];
  }

  if (req.body.queryResult.parameters['loading-type']) {
    transportationData['loading-type'] = req.body.queryResult
      .parameters['loading-type'];
  }

  if (req.body.queryResult.parameters['trailer-type']) {
    transportationData['trailer-type'] = req.body.queryResult
      .parameters['trailer-type'];
  }

  if (req.body.queryResult.parameters['truck-type']) {
    transportationData['truck-type'] = req.body.queryResult
      .parameters['truck-type'];
  }

  if (req.body.queryResult.parameters['grain-type']) {
    transportationData['grain-type'] = req.body.queryResult
      .parameters['grain-type'];
  }

  if (req.body.queryResult.parameters['location-from']) {
    transportationData['location-from'] = req.body.queryResult
      .parameters['location-from'];
  }

  if (req.body.queryResult.parameters['location-to']) {
    transportationData['location-to'] = req.body.queryResult
      .parameters['location-to'];
  }

  if (req.body.queryResult.parameters['unloading-time']) {
    transportationData['unloading-time'] = req.body.queryResult
      .parameters['unloading-time'];
  }

  if (req.body.queryResult.parameters['loading-time']) {
    transportationData['loading-time'] = req.body.queryResult
      .parameters['loading-time'];
  }

  if (req.body.queryResult.parameters.period.startTime) {
    transportationData['period-start'] = req.body.queryResult.parameters
      .period.startTime;
    transportationData['period-end'] = req.body.queryResult.parameters
      .period.endTime;
  }

  if (req.body.queryResult.parameters.compatibility) {
    transportationData.compatibility = req.body.queryResult.parameters
      .compatibility;
  }

  if (req.body.queryResult.parameters.urgency) {
    transportationData.urgency = req.body.queryResult.parameters.urgency;
  }

  if (req.body.queryResult.parameters.date) {
    transportationData.date = req.body.queryResult.parameters.date;
  }

  if (req.body.queryResult.parameters['loading-time'].startTime) {
    transportationData['loading-time-start'] = req.body.queryResult
      .parameters['loading-time'].startTime;
    transportationData['loading-time-end'] = req.body.queryResult
      .parameters['loading-time'].endTime;
  } else if (req.body.queryResult.parameters['loading-time']) {
    transportationData['loading-time'] = req.body.queryResult
      .parameters['loading-time'];
  }

  if (req.body.queryResult.parameters['unloading-time'].startTime) {
    transportationData['unloading-time-start'] = req.body.queryResult
      .parameters['unloading-time'].startTime;
    transportationData['unloading-time-end'] = req.body.queryResult
      .parameters['unloading-time'].endTime;
  } else if (req.body.queryResult.parameters['unloading-time']) {
    transportationData['unloading-time'] = req.body.queryResult
      .parameters['unloading-time'];
  }
  • Вопрос задан
  • 251 просмотр
Решения вопроса 1
profesor08
@profesor08 Куратор тега JavaScript
Обойди их циклом, у тебя же все одинаково.

for (let p in req.body.queryResult.parameters) {
  if (req.body.queryResult.parameters.hasOwnProperty(p)) {
    transportationData[p] = req.body.queryResult.parameters[p];
  }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Если не нравится идея с циклом по какой-то причине (например, хочется явно указать список параметров) - можно создать анонимную функцию

function saveParam (title) {
  var param = req.body.queryResult.parameters[title];
  if (param) {
    transportationData[title] = param;
  }
}

saveParam('places-count');
saveParam('contact-person');
saveParam('stowing-type');
saveParam('cargo-type');
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
30 апр. 2024, в 15:24
3000 руб./за проект
30 апр. 2024, в 15:11
500 руб./в час
30 апр. 2024, в 15:11
5000 руб./за проект