我正在编写一个使用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调用?
答案 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'});
}
});