【问题标题】:What is the best way to do nested API calls with oauth in node.js?在 node.js 中使用 oauth 进行嵌套 API 调用的最佳方法是什么?
【发布时间】:2020-04-13 00:45:11
【问题描述】:

我正在编写一个 API,它使用 oauth v1 API 从 twitter 获取数据并将其提供给我的 web 应用程序。

我有一个 api 端点,它从 Twitter 获取一组对象,这些对象代表用户创建的每个列表。

我有另一个 api 端点,给定一个列表 ID,它获取该列表中所有成员的数组。

我想将这两个端点合二为一,因此我的 web 应用程序可以请求“/api/getAllLists”,它将接收一个列表对象数组 (API 1),其中一个对象的属性是一个完整列表成员数 (API 2)。

我一直纠结于如何做到这一点 - 我以前使用过 Promise 和异步函数,但我不知道实现这一点的最佳方法。

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);
        }
    });
});

【问题讨论】:

    标签: javascript node.js oauth twitter-oauth


    【解决方案1】:

    我已经完成了我的目标:

            //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;
                                }
                            })
                        })
                }
            });
    

    虽然我绝对不认为 theis 是最佳实践方法,但我仍然希望看到其他人的建议或更正,谢谢。

    【讨论】:

      猜你喜欢
      • 2013-10-09
      • 2019-04-26
      • 1970-01-01
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      • 2015-11-03
      • 1970-01-01
      • 2016-05-18
      相关资源
      最近更新 更多