diff --git a/package-lock.json b/package-lock.json index c447c8f..b2e3326 100644 --- a/package-lock.json +++ b/package-lock.json @@ -219,6 +219,11 @@ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, + "async-lock": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.2.4.tgz", + "integrity": "sha512-UBQJC2pbeyGutIfYmErGc9RaJYnpZ1FHaxuKwb0ahvGiiCkPUf3p67Io+YLPmmv3RHY+mF6JEtNW8FlHsraAaA==" + }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -3361,9 +3366,9 @@ } }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" }, "lodash._createcompounder": { "version": "3.0.0", diff --git a/package.json b/package.json index 1faf4d9..b1d4060 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "homepage": "https://github.com/shouldnotappearcalm/yapi-plugin-interface-oauth2#readme", "dependencies": { "add": "^2.0.6", + "async-lock": "^1.2.4", "axios": "^0.19.0", "global": "^4.4.0", "yarn": "^1.22.0", diff --git a/utils/syncTokenUtil.js b/utils/syncTokenUtil.js index 8c2c7ba..1e1ca5a 100755 --- a/utils/syncTokenUtil.js +++ b/utils/syncTokenUtil.js @@ -1,9 +1,12 @@ const schedule = require('node-schedule'); +var AsyncLock = require('async-lock'); const projectModel = require('models/project.js'); const oauthModel = require('../model/oauthModel.js'); const yapi = require('yapi.js'); const jobMap = new Map(); +var lock = new AsyncLock({timeout: 5000}); + class syncTokenUtils { constructor(ctx) { yapi.commons.log( @@ -117,44 +120,50 @@ class syncTokenUtils { 'token更新定时器触发, getTokenUrl:' + oauthData.get_token_url ); //对定时任务存在的必要性做判断 - let projectData; - try { - projectData = await this.preRefresh(oauthData); - } catch (e) { - return; - } + lock.acquire(oauthData.project_id, async function(done) { + let projectData; + try { + projectData = await this.preRefresh(oauthData); + } catch (e) { + return; + } - let projectId = projectData._id; - let getTokenUrl = oauthData.get_token_url; - let method = oauthData.request_type; - let headers_data = oauthData.headers_data; - let result; - try { - if (method === 'GET') { - let params = oauthData.params; - result = await this.execGetToken(getTokenUrl, method, headers_data, params); - } else { - let dataType = oauthData.dataType; - let formData = oauthData.form_data; - let dataJson = oauthData.data_json; - result = await this.execGetToken( - getTokenUrl, - method, - headers_data, - formData, - dataJson, - dataType - ); + let projectId = projectData._id; + let getTokenUrl = oauthData.get_token_url; + let method = oauthData.request_type; + let headers_data = oauthData.headers_data; + let result; + try { + if (method === 'GET') { + let params = oauthData.params; + result = await this.execGetToken(getTokenUrl, method, headers_data, params); + } else { + let dataType = oauthData.dataType; + let formData = oauthData.form_data; + let dataJson = oauthData.data_json; + result = await this.execGetToken( + getTokenUrl, + method, + headers_data, + formData, + dataJson, + dataType + ); + } + let accessToken = this.getTokenByPath(result, oauthData.token_path); + //更新到对应的env上; + await this.updateProjectToken(accessToken, oauthData, projectData); + this.saveSyncLog(0, '环境:【' + oauthData.env_name + '】更新新的token【' + accessToken + '】成功', '1', projectId); + yapi.commons.log('环境:【' + oauthData.env_name + '】更新token成功'); + done(); + } catch (e) { + this.saveSyncLog(-1, '环境:【' + oauthData.env_name + '】数据格式出错,请检查', '1', projectId); + yapi.commons.log('环境:【' + oauthData.env_name + '】获取数据失败' + e.message); + done(); } - let accessToken = this.getTokenByPath(result, oauthData.token_path); - //更新到对应的env上; - await this.updateProjectToken(accessToken, oauthData, projectData); - this.saveSyncLog(0, '环境:【' + oauthData.env_name + '】更新新的token【' + accessToken + '】成功', '1', projectId); - yapi.commons.log('环境:【' + oauthData.env_name + '】更新token成功'); - } catch (e) { - this.saveSyncLog(-1, '环境:【' + oauthData.env_name + '】数据格式出错,请检查', '1', projectId); - yapi.commons.log('环境:【' + oauthData.env_name + '】获取数据失败' + e.message); - } + }, function(err, ret) { + yapi.commons.log('更新 token 失败,' + err.message); + }, {}); } /**