Я пишу вызов API, который использует async Promise с экспрессом и 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'});
});
метод преобразования возвращает новый Promise (), который генерирует данные, используемые в вызове then (), показанном выше (в 4-й строке), однако я, похоже, не могу вернуть ответ с полями, созданными из данных выше. Итак, мой вопрос: как мне ответить на вызов API, когда оценка этого вызова должна пройти через поток Promise -> resolve -> затем?
@SamiHult откуда я отправлю ответ на вызов API?
Он отправляется методами, которые вы вызываете для объекта res. Да, и не забудьте, что на end() ответ: res.status(200)...end();.
Мне жаль, что я не понимаю. «Он отправляется методами, которые вы вызываете для объекта res», какие это методы? какие методы вы имеете в виду?
Когда вы напишете res.status(500).json(...).end(), экспресс отправит вывод.





Вы можете использовать следующий параметр / обратный вызов маршрута, чтобы дождаться обещаний и / или других асинхронных операций. Для вашего примера (не проверено):
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'});
Этот код возвращает res перед выполнением, добавьте это в еще блок в своем коде
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'});
}
});
Вы пробовали вернуть обещание от обработчика? Добавьте
returnперед строкойserverStatus.transform.... И возвращатьres.status...не нужно.