Вернуть ответ API от Promise.then () - PullRequest
0 голосов
/ 17 сентября 2018

Я пишу вызов API, который использует асинхронную Promise с Express и Bluebird. У меня есть следующий код:

router.get('/', (req, res) => {
  log.debug('api - v2 - Koko Version api call');
  if (req.query.prop) {
    serverStatus.transform(req).then((data) => {
      switch (req.query.prop) {
        case 'KokoVersion': {
          return res.status(200).json({KokoVersion: data.version});
        }
        case 'KokoType': {
          return res.status(200).json({KokoType: data.deviceType});
        }
        case 'LastChangeTime': {
          return res.status(200).json({LastChangeTime: data.lastApply});
        }
      }
    }).catch((error) => {
      log.debug('Failed returning from Promise.resolve - v2 properties API');
    });
  }
  return res.status(500).json({status: 'ERROR', message: 'Internal Server error'});
});

метод transform возвращает новый Promise (), который генерирует данные, использованные в вызове then (), показанном выше (в 4-й строке), однако я не могу вернуть ответ с полями, созданными из данных выше. Итак, мой вопрос - как мне ответить на вызов API, когда оценка этого вызова должна пройти через поток Обещание -> разрешить -> затем?

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018
return res.status(500).json({status: 'ERROR', message: 'Internal Server error'});

Этот код возвращает res перед выполнением, добавьте его в else block в ваш код

router.get('/', (req, res) => {
  log.debug('api - v2 - Koko Version api call');
  if (req.query.prop) {
    serverStatus.transform(req).then((data) => {
      switch (req.query.prop) {
        case 'KokoVersion': {
          return res.status(200).json({KokoVersion: data.version});
        }
        case 'KokoType': {
          return res.status(200).json({KokoType: data.deviceType});
        }
        case 'LastChangeTime': {
          return res.status(200).json({LastChangeTime: data.lastApply});
        }
      }
    }).catch((error) => {
      log.debug('Failed returning from Promise.resolve - v2 properties API');
    });
  } else {
    return res.status(500).json({status: 'ERROR', message: 'Internal Server error'});
  }
});
0 голосов
/ 17 сентября 2018

Вы можете использовать следующий параметр / обратный вызов маршрута для ожидания обещаний и / или других асинхронных операций. Для вашего примера (не проверено):

router.get('/', (req, res, next) => {
  log.debug('api - v2 - Koko Version api call');
  if (req.query.prop) {
    serverStatus.transform(req).then((data) => {
      switch (req.query.prop) {
        case 'KokoVersion': {
          res.status(200).json({KokoVersion: data.version});
        }
        case 'KokoType': {
          res.status(200).json({KokoType: data.deviceType});
        }
        case 'LastChangeTime': {
          res.status(200).json({LastChangeTime: data.lastApply});
        }
      }
      next();
    }).catch((error) => {
      log.debug('Failed returning from Promise.resolve - v2 properties API');
      res.status(500).json({status: 'ERROR', message: 'Internal Server error'});
      next();
    });
  }
});
...