#node.js #express #async-await #axios
#node.js #экспресс #асинхронное ожидание #axios
Вопрос:
Мне нужно написать API, который будет вызывать один POST API и передавать полученные от него данные в другой POST API, а затем возвращать данные из второго API пользователю.
Также должна быть выполнена надлежащая обработка ошибок, чтобы API возвращал сообщение об ошибке и не выходил из строя, когда один из API не работает
Код, который я пробовал, выглядит следующим образом
listPopularPost: async(req, res) => {
let requestUrl = process.env.USER_SERVICE_URL "/api/" process.env.API_VERSION '/story-popular';
try{
await axios.post(requestUrl, req.body, requestHeader).then((response) => {
if(response.data.success == true){
let cmsRequestUrl = process.env.CMS_SERVICE_URL process.env.API_VERSION "/story/popular";
let requestParam = {
"request" : req.body,
"user_params": response.data.story_ids,
}
axios.post(cmsRequestUrl, requestParam,requestHeader).then((response) => {
res.status(200).send(response.data);
}, (error) => {
res.status(200).send({'success':false,'code':'request_error','message':'error encountered','data':{'error':error}});
});
}
}, (error) => {
res.status(200).send(error);
});
}
catch(err){
console.log(err)
res.status(500).send(err);
}
},
Но это тайм-аут и не работает. Как я могу исправить этот код?
Ответ №1:
Поскольку вы используете async / await. Вы могли бы провести рефакторинг как
listPopularPost: async (req, res) => {
let requestUrl = process.env.USER_SERVICE_URL "/api/" process.env.API_VERSION '/story-popular';
try {
let data = await axios.post(requestUrl, req.body, requestHeader).then((response) => response.data);
if (data.success) {
let cmsRequestUrl = process.env.CMS_SERVICE_URL process.env.API_VERSION "/story/popular";
let requestParam = {
"request": req.body,
"user_params": data.story_ids,
}
data = await axios.post(cmsRequestUrl, requestParam, requestHeader).then((response) => response.data);
return res.status(200).send(data);
}
return res.status(500).send({ 'success': false, 'code': 'request_error', 'message': 'error encountered', 'data': { 'error': new Error("Request wasn't successful") } });
}
catch (err) {
console.log(err)
res.status(500).send({ 'success': false, 'code': 'request_error', 'message': 'error encountered', 'data': { 'error': error } });
}
}
или без использования async / await
listPopularPost: (req, res) => {
let requestUrl = process.env.USER_SERVICE_URL "/api/" process.env.API_VERSION '/story-popular';
axios.post(requestUrl, req.body, requestHeader).then((response) => response.data)
.then((data) => {
if (!data.success) throw new Error("Request was unsuccessful");
let cmsRequestUrl = process.env.CMS_SERVICE_URL process.env.API_VERSION "/story/popular";
let requestParam = {
"request": req.body,
"user_params": data.story_ids,
}
return axios.post(cmsRequestUrl, requestParam, requestHeader);
})
.then(response => response.data)
.then(data => res.status(200).send(data))
.catch(err => {
console.log(err)
res.status(500).send({ 'success': false, 'code': 'request_error', 'message': 'error encountered', 'data': { 'error': error } });
});
}
Комментарии:
1. Вы уверены, что это значение response.data.story_ids будет передано, а не перезаписано?
2. да, вы правы @SaeeshTendulkar. Я только что отредактировал его.
3. Я попробовал использовать async / await, и по какой-то причине он переходит к блоку catch
4. да, он перейдет к блоку catch, если в каком-либо из обещаний будет выдана ошибка
5. Но я попробовал отдельные API, и они оба работают. Как мне это отладить?