專案在微信環境開發,需要獲取access_token進行授權登入和獲取使用者資訊。
特意把這塊功能拿出來封裝一個自定義module
module.exports = new Wechat(con.appid, con.secret, con.url);
之前appid和secret是在本地配置檔案寫死的,後來要求系統後臺可以配置公眾號。
就需要從後臺請求來獲取配置引數。這就遇到問題了。
var wechat = require(`./modules/wechat`); var rule = new schedule.RecurrenceRule();
//rule.hour = [0,2,4,6,8,10,12,14,16,18,20,22];
rule.minute = 0;
var j = schedule.scheduleJob(rule, function(){
wechat.getBaseTokenForever();
});
wechat.getBaseTokenForever();
我的服務會在開啟以及每小時來獲取新的access_token,並存入資料庫,以保證其是一直有效的,用來控制請求次數不會超額。
後來模組改為
var data = {}; request({ url: con.url + `/路由`, method: "POST", json: true, body: {} }, function (err, response, body) { if (err || body.code != 0) { console.log(`獲取公眾號配置失敗 `+ Date()); } else { console.log(`獲取公眾號配置 `+ Date()); data = body.data; } }); module.exports = function () { return new Wechat(data.appid, data.secret, con.url); };
但是nodejs的非同步特效,會導致請求沒有完成就執行下面的程式碼,出現錯誤。
經過多方查詢,可以使用async模組來非同步轉同步,只有前一個function執行callback,下一個才會執行。
var async = require(`async`); async.waterfall([ function(callback){ getWechat(); function getWechat() { if(!wechat().appid){ setTimeout(function () { getWechat(); },1000); console.log(wechat()); } else { callback(null,wechat()) } } }, function(wechat, callback){
var rule = new schedule.RecurrenceRule(); //rule.hour = [0,2,4,6,8,10,12,14,16,18,20,22]; rule.minute = 0; var j = schedule.scheduleJob(rule, function(){ wechat.getBaseTokenForever(); }); wechat.getBaseTokenForever(); callback(null) } ], function(err, results){ console.log(err) });