我开始使用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服务器端有点新鲜。
答案 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: "..."}