node.js - 使用适当的错误处理进行连续的 axios post API 调用
问题描述
我需要编写一个 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);
}
},
但它超时并且不起作用。如何修复此代码?
解决方案
由于您使用的是异步/等待。你可以重构为
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 } });
});
}
推荐阅读
- apache-spark - Spark - 如何将文本文件转换为多列模式 DataFrame/Dataset
- php - php 使用字符串作为变量名 print_r
- r - 在 y 轴上具有比例而不是计数的堆叠条形图
- jquery - jquery数组json推送多维
- javascript - 如何在javascript中将对象添加到数组中的另一个对象
- java - 如何使用 thymeleaf 动态更新表格?
- openshift - Openshift OKD 3.11 安装在任务期间崩溃 [openshift_node : 安装节点、客户端和 conntrack 包]
- arrays - Maxima:定义一个函数,该函数返回一个范围内的随机整数,使得该值与另一个值或其他值的列表不同
- tomcat - 内容安全策略未出现
- typescript - 函数参数返回类型的打字稿类型推断