Return 来自 Promise.then() 的 API 响应

Return an API response from a Promise.then()

我正在编写一个 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'});
});

转换方法 return 是一个新的 Promise(),它生成上面(第 4 行)调用 then() 中使用的数据,但是我似乎无法 return 响应从上面的数据创建的字段。所以我的问题是 - 当 API 调用的评估需要通过 Promise --> resolve --> then 流程时,我如何响应该调用?

您可以使用路由的下一个 param/callback 来等待承诺 and/or 其他异步操作。对于您的示例(未测试):

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();
    });
  }
});
return res.status(500).json({status: 'ERROR', message: 'Internal Server error'});

此代码 return 在您执行之前保存,将其添加到您代码

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