从Promise.then()返回API响应

时间:2018-09-17 08:18:06

标签: node.js rest express promise bluebird

我正在编写一个使用Express和bluebird的异步Promise的API调用。 我有以下代码:

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 methoid返回一个新的Promise(),该Promise()生成上面(在第4行中)看到的then()调用中使用的数据,但是我似乎无法返回从上面的数据创建的字段的响应。所以我的问题是-当该调用的评估需要经历Promise-> resolve->然后的流程时,如何响应该API调用?

2 个答案:

答案 0 :(得分:1)

您可以使用路由的下一个参数/回调来等待Promise和/或其他异步操作。对于您的示例(未经测试):

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();
    });
  }
});

答案 1 :(得分:0)

return res.status(500).json({status: 'ERROR', message: 'Internal Server error'});

此代码在执行前返回res,将其添加到代码的 else块

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'});
  }
});