在 node.js 中使用 oauth 进行嵌套 API 调用的最佳方法是什么?
What is the best way to do nested API calls with oauth in node.js?
我正在编写一个 API,它使用 oauth v1 API 从 Twitter 中获取数据并将其提供给我的网络应用程序。
我有一个 api 端点,它从 Twitter 获取代表用户创建的每个列表的对象数组。
我有另一个 api 端点,给定列表 ID,获取该列表所有成员的数组。
我想将这两个端点合二为一,这样我的网络应用程序就可以请求“/api/getAllLists”,它会收到一个列表对象数组 (API 1),其中一个属性对象的完整成员列表 (API 2).
我一直在纠结于如何做到这一点——我以前使用过 promises 和异步函数,但我不知道完成这个的最佳方法。
router.get('/getAllLists', isLoggedIn, (req, res) => {
//oauth access credentials
let {oauthAccessToken, oauthAccessTokenSecret, username, user_id} = req.cookies.twitter || '';
//first api call to get array of list objects
consumer.get("https://api.twitter.com/1.1/lists/list.json?user_id="+user_id, oauthAccessToken, oauthAccessTokenSecret, (error, data, response) => {
if (error) {
console.log(error)
} else {
data = JSON.parse(data).map((list) => {
let newList = list;
//second API call, using list.id_str fromt he first call
consumer.get("https://api.twitter.com/1.1/lists/members.json?list_id="+list.id_str, oauthAccessToken, oauthAccessTokenSecret, (error, data, response) => {
if (error) {
console.log(error);
} else {
newList.contents = data;
return newList;
}
});
return newList;
})
res.send(data);
}
});
});
我已经完成了我的目标:
//oauth access credentials
let { oauthAccessToken, oauthAccessTokenSecret, username, user_id } = req.cookies.twitter || '';
consumer.get("https://api.twitter.com/1.1/lists/list.json?user_id=" + user_id, oauthAccessToken, oauthAccessTokenSecret, (error, data, response) => {
if (error) {
console.log(error)
} else {
let allLists = [];
let allListLength = JSON.parse(data).length;
let listCounter = 0;
const addToAllLists = (list) => {
allLists.push(list)
listCounter ++;
if(listCounter === allListLength) {
res.send(allLists)
}
}
JSON.parse(data).map((list,i) => {
let newList = list;
consumer.get("https://api.twitter.com/1.1/lists/members.json?count=4999&list_id=" + list.id_str, oauthAccessToken, oauthAccessTokenSecret, (error, data2, response) => {
if (error) {
console.log(error);
} else {
newList.users = JSON.parse(data2).users;
addToAllLists(newList)
return newList;
}
})
})
}
});
虽然我绝对不认为这是最佳实践方法,但我仍然希望看到其他人的建议或更正,谢谢。
我正在编写一个 API,它使用 oauth v1 API 从 Twitter 中获取数据并将其提供给我的网络应用程序。
我有一个 api 端点,它从 Twitter 获取代表用户创建的每个列表的对象数组。
我有另一个 api 端点,给定列表 ID,获取该列表所有成员的数组。
我想将这两个端点合二为一,这样我的网络应用程序就可以请求“/api/getAllLists”,它会收到一个列表对象数组 (API 1),其中一个属性对象的完整成员列表 (API 2).
我一直在纠结于如何做到这一点——我以前使用过 promises 和异步函数,但我不知道完成这个的最佳方法。
router.get('/getAllLists', isLoggedIn, (req, res) => {
//oauth access credentials
let {oauthAccessToken, oauthAccessTokenSecret, username, user_id} = req.cookies.twitter || '';
//first api call to get array of list objects
consumer.get("https://api.twitter.com/1.1/lists/list.json?user_id="+user_id, oauthAccessToken, oauthAccessTokenSecret, (error, data, response) => {
if (error) {
console.log(error)
} else {
data = JSON.parse(data).map((list) => {
let newList = list;
//second API call, using list.id_str fromt he first call
consumer.get("https://api.twitter.com/1.1/lists/members.json?list_id="+list.id_str, oauthAccessToken, oauthAccessTokenSecret, (error, data, response) => {
if (error) {
console.log(error);
} else {
newList.contents = data;
return newList;
}
});
return newList;
})
res.send(data);
}
});
});
我已经完成了我的目标:
//oauth access credentials
let { oauthAccessToken, oauthAccessTokenSecret, username, user_id } = req.cookies.twitter || '';
consumer.get("https://api.twitter.com/1.1/lists/list.json?user_id=" + user_id, oauthAccessToken, oauthAccessTokenSecret, (error, data, response) => {
if (error) {
console.log(error)
} else {
let allLists = [];
let allListLength = JSON.parse(data).length;
let listCounter = 0;
const addToAllLists = (list) => {
allLists.push(list)
listCounter ++;
if(listCounter === allListLength) {
res.send(allLists)
}
}
JSON.parse(data).map((list,i) => {
let newList = list;
consumer.get("https://api.twitter.com/1.1/lists/members.json?count=4999&list_id=" + list.id_str, oauthAccessToken, oauthAccessTokenSecret, (error, data2, response) => {
if (error) {
console.log(error);
} else {
newList.users = JSON.parse(data2).users;
addToAllLists(newList)
return newList;
}
})
})
}
});
虽然我绝对不认为这是最佳实践方法,但我仍然希望看到其他人的建议或更正,谢谢。