首页 > 解决方案 > 使用异步 node.js 进行 Twitter API 光标导航

问题描述

我正在尝试使用 async/await 将 Twitter 的 API 与 node.js 一起使用(我承认我是新手),但我正在努力获得下一个光标值。

为什么我的getFollowers下面的函数总是在await块之前返回?

require('dotenv').config();

const Twitter = require('twitter');
 
const client = new Twitter({
  consumer_key: process.env.API_KEY,
  consumer_secret: process.env.API_KEY_SECRET,
  access_token_key: process.env.ACCESS_TOKEN,
  access_token_secret: process.env.ACCESS_TOKEN_SECRET
});
 
const getFollowers = async (screen_name, count, cursor) => {
    console.log("Cursor: " + cursor);
    const params = {
        screen_name: screen_name,
        count: count,
        cursor: cursor
    };

    const promise = await client.get('followers/list', params)
        .then(data => {
            console.log("This promise is never executed...");
            return data.next_cursor;
        })
        .catch(err => console.error(err));

    return promise;
}

const main = async () => {
    let cursor = -1;
    while (cursor != 0) {
        getFollowers(process.env.SCREEN_NAME, 200, cursor)
            .then(next_cursor => {
                cursor = next_cursor;
                console.log("This promise is never executed either... " + cursor);
            });
    }
}

main();

标签: javascriptnode.jstwitterasync-await

解决方案


我放弃了使用Twitter包的实现,转而使用axios

require('dotenv').config();

const axios = require('axios');

const credentials = {
    consumer_key: process.env.API_KEY,
    consumer_secret: process.env.API_KEY_SECRET,
    access_token_key: process.env.ACCESS_TOKEN,
    access_token_secret: process.env.ACCESS_TOKEN_SECRET
};

const FOLLOWERS_LIST_ENDPOINT = "https://api.twitter.com/1.1/followers/list.json";

//documentation: https://developer.twitter.com/en/docs/authentication/oauth-2-0/application-only
const generateToken = async () => {
    return process.env.BEARER_TOKEN;
}

//documentation: https://developer.twitter.com/en/docs/twitter-api/v1/accounts-and-users/follow-search-get-users/api-reference/get-followers-list
const getFollowers = async (screen_name, count, cursor) => {
    let token = await generateToken();
    let requestConfig = {
        params: {
            screen_name: screen_name,
            count: count,
            cursor: cursor,
            include_user_entities: false
        },
        headers: { 
            Authorization: `Bearer ${token}` 
        }
    };
    let response = await axios.get(FOLLOWERS_LIST_ENDPOINT, requestConfig);
    let users = response.data.users;
    processUsers(users);
    return response.data.next_cursor;
};

const processUsers = (users) => {
    users.map(user => {
        console.log(user.screen_name);
    });
}
const main = async () => {
    let cursor = -1;
    while (cursor != 0) {
        cursor = await getFollowers(process.env.SCREEN_NAME, 200, cursor);
    }
}

main();

推荐阅读