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

我开始使用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服务器端有点新。

不知道更多关于这个特定的上下文,一个Promise的.then()语句可以被链接,其中一个.then .then()调用中的“thenable”stream入下一个。

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

 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: "..."} 

有关更多信息,请参阅Promise.prototype.then()上的此MDN文章 。