-2

美好的一天,我有一个从 API 中提取的自定义 adonisjs 命令。

async handle (args, options) {
    // Status 
    // Open = 1979

    // Get all jobs with open status.
    const pullJobController = new PullJobsFromJobAdderController;
    let token = await pullJobController.get_token();

    if(token){
        const jobs = await this._getOpenJobs('https://jobs/open-jobs', token , 1979);
    }
}

async _getOpenJobs(url, accessToken, status) {
        url = url + '?statusId=' + status
        const headers = {
            'Authorization': 'Bearer ' + accessToken
        }

        const options = {
            method: 'GET',
            url: url,
            headers: headers
        }

        return (await rp(options).then(function (result) {
            return {
                status: true,
                info: JSON.parse(result)
            }
            
        }).catch(function (error) {
            return {
                status: false
            }
        }));

    } // _getOpenJobs()

PullJobsFromJobAdderController

async get_token()
    {
        // This works if directly returning the token.
        // return "9ade34acxxa4265fxx4b5x6ss7fs61ez";  

        const settings = await this.settings();
        const jobAdderObject = new this.JobAdder(settings.jobadder['client.id'], settings.jobadder['client.secret'])
        const jobadderOauthObject = this.model('JobadderOauth');
        
        const accessInfo = await jobadderOauthObject.jobdderLatestAccess();

        let isAccessExpired = await this.checkAccessValidity(accessInfo.created_at);
        let accessToken = accessInfo.access_token;
        let apiEndpoint = accessInfo.api_endpoint;
        
        if(isAccessExpired === true){
            let refreshTokenInfo = await jobAdderObject.refrehToken(accessInfo.refresh_token)

            if (refreshTokenInfo.status === true) {
                let refreshTokenDetails = JSON.parse(refreshTokenInfo.info)
                accessToken = refreshTokenDetails.access_token
                apiEndpoint = refreshTokenDetails.api

                await jobadderOauthObject.create({
                    code: accessInfo.code,
                    access_token: refreshTokenDetails.access_token,
                    refresh_token: refreshTokenDetails.refresh_token,
                    scope: 'read write offline_access',
                    api_endpoint: refreshTokenDetails.api
                })
            }
        }
        
        return accessToken;
    } // get_token()

函数 async get_token 按预期工作,它为我提供了一个新的令牌,供 adonisjs 命令使用。但是它在运行命令后冻结。

但是如果我直接返回字符串令牌。自定义命令 handle() 按预期工作并在运行后终止。

场景一:(直接从 PullJobsFromJobAdderController 返回token字符串)

  1. 我运行我的自定义命令“adonis pull:jobs”,它按预期运行,在终端中显示从 api 提取数据的结果。
  2. 终端已准备好接受另一个命令。 在此处输入图像描述

场景2:(将PullJobsFromJobAdderController直接返回的字符串token注释掉)

  1. 我运行我的自定义命令“adonis pull:jobs”,它按预期运行,在终端中显示从 api 提取数据的结果。
  2. 在我按 ctrl+c 并终止当前作业/命令之前,终端不接受命令。 在此处输入图像描述

也许我错过了有关异步等待调用的一些信息。

有人可以指出/帮助我正确的方向吗?

TIA

4

1 回答 1

0

我明白了,对于其他任何在使用 adonis 命令时遇到此类问题的人:将任务包装在 try...catch 块中的句柄中,然后始终将 Database.close() 和 process.exit() 放入最后。

于 2021-08-24T06:04:01.640 回答