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