Node.js拦截Promise并详细说明Response

时间:2016-08-27 09:00:39

标签: javascript node.js express promise

我开始使用Node.js + Express,目前我正在编写HTTP API结构。

我有一个控制器使用以下模式公开一些方法: my_controller.js

'use strict';
var AppApiFactory = function (express, appService) {

    var api = express.app;

    /* Get all apps ordered by Name Ascending */
    function getAllApps(request, response) {
        appService.getApps(request.query.$expand).then(function (apps) {
            response.status(200).send(apps);
            })
            .catch(function (err) {
                console.error('Error occurred in Apps Api: ' + err);
                response.status(500).send("" + err);
        });
    }

    /* Routing */
    api.get('/api/v1/apps', getAllApps);

    return {
        getAllApps: getAllApps,
    };
};

module.exports = AppApiFactory;

appService 是我的ORM返回的一个简单方法,包括Promise和一组对象。 现在,因为我必须实现一些ISO / RFC标准,所以必须将响应转换为更复杂的结构,如:

{
   "data":[my promise array],
   "count":10,
   "type":"xmlns:mytype..."
}

如何拦截ORM返回的Promise,修改内容并再次从Express Controller返回另一个承诺? 这可能吗?

也许这是一个愚蠢的问题,但我仍然没有掌握承诺背后的概念。 我来自.NET / Java,JavaScript(客户端)世界,所以我对JavaScript服务器端有点新鲜。

1 个答案:

答案 0 :(得分:1)

在不了解更多有关此特定上下文的情况下,可以链接Promise的.then()语句,其中来自一个.then()调用的“thenable”流入下一个。

在您的情况下,它可能看起来像这样:

function getAllApps() {
  return appService
    .getApps(request.query.$expand)
    .then(function(apps) {
      response.status(200).send(apps);
      return {
        data: apps,
        count: apps.length,
        type: "xmlns:mytype..."
      }
    })
    .catch(...);
}

调用getAllApps()然后会返回一个承诺,该承诺会从appService.getApps()获取原始回复,并将其转换为您期望的格式。

getAllApps.then(function(response) {
  console.log(response);
});

// {data: [...], length: 10, type: "..."}

See this MDN article on Promise.prototype.then() for more