Улучшение обработки Экспресс-конечная точка


У меня есть шлюз API в больший набор микросервисов, и я справляюсь один из моих маршрутов. Конечная точка заканчивает удаленном вызове процедур в другом сервисе, а потом просто войдите в ответ и отправить его обратно пользователю. Я действительно не завершена ошибка раздел Обращения, потому что думал, что я мог бы добавить некоторые промежуточного позже, чтобы справиться мои ошибки.

routes.post("/submit", async (request, result) => {
  logger.info("Received call to /gapf/submit endpoint");
  const gapf = request.body;

  // convert relevant request strings into integers
  gapf.facultyId = parseInt(gapf.facultyId, 10);
  gapf.created = parseInt(gapf.created, 10);
  gapf.lastModified = parseInt(gapf.lastModified, 10);
  if (gapf.documents !== undefined) {
    gapf.documents = gapf.documents.map(doc => {
      return {
        name: doc.name,
        link: doc.link,
        attachedDate: parseInt(doc.attachedDate, 10)
      };
    });
  }

  try {
    logger.info("Calling to Ticket Service with gapf body: %j", gapf);
    const response = await tridentClient.SubmitGAPF(gapf);
    logger.info("Received response from Ticket Service: %j", response);
    logger.info("Exiting /gapf/submit endpoint");
    result.json(response);
  } catch (err) {
    logger.error(
      "Received error from submitting to Ticket Service: ",
      err.message
    );
    // TODO: should add middleware later on to handle errors
    result.status(500);
    result.json({});
  }
});

Сейчас error.message Кажется, некоторые двоичные данные вместо JSONТак, что бы также должны быть исправлены позже.



Комментарии
1 ответ

Помимо первого вопроса, ваш код в основном чисто!


  • Что произойдет, если один из parseInt вызовы бросает исключение? В таком случае, я бы отправить HTTP 500 ошибка также. Это особенно актуально в случае, когда данные поступают от неизвестного клиента.
    По сути, решение сводится к оборачивать весь код в try-catch или при применении промежуточного слоя.

    routes.post("/submit", async (request, result) => {
    try {
    /* all the code */
    }
    catch (err) {
    /* log & send a generic HTTP 500 error message as in your code */
    /* Beware that you might not intend to send a HTTP 500 message if
    the code in the try already sent something! */
    }
    });

    // <=>
    routes.post("/submit", wrapSafe(yourCodeExtractedAsAFunction));

    // <=>
    routes.post("/submit", someMiddleWare(yourCodeAsAFunction));


  • Ловить все исключения (и не перебросок, которые вы не ручка) - это нормально в вашем случае, поскольку ваша функция верхнего уровня достаточно для этого.
    Точно так, как вы говорите, если вы добавите промежуточное, пусть пузырь исключение и пусть промежуточного заботиться о нем.

  • Опустить return в функции стрелкой, если он не нужен и не служит никакой ясности. Так вот этот блок:


    gapf.documents = gapf.documents.map(doc => {
    return {
    name: doc.name,
    link: doc.link,
    attachedDate: parseInt(doc.attachedDate, 10)
    };
    });

    Можно обновить так:

    // You need enclosing parentheses, so that the parser can
    // differentiate between a block statement and an object literal.
    gapf.documents = gapf.documents.map(doc => ({
    name: doc.name,
    link: doc.link,
    attachedDate: parseInt(doc.attachedDate, 10)
    }));

  • // convert relevant request strings into integersвы могли бы описать, что представляет собой "соответствующий запрос строку". Есть ли их список?

2
ответ дан 20 марта 2018 в 03:03 Источник Поделиться