这个后台中,我们主要使用的是微信小程序的云数据库,那么如果我们要在我们的项目中调用这个云数据库,那么肯定避免不了要使用到access_token这个参数,这里就教大家如何封装一个自动更新access_token的函数。
1.这里要用到request、request-promise
npm install request
npm install request-promise
在根目录下创建一个utils文件夹,里面创建getAccessToken.js
const rp = require('request-promise')
const APPID = '' //这里填入你的微信小程序appid
const APPSECRET = ''//这里填入你的微信小程序秘钥
const URL = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${APPID}&secret=${APPSECRET}`
const fs = require('fs')
const path = require('path')
const fileName = path.resolve(__dirname, './access_token.json')
//console.log(fileName)
//设置token
const updateAccessToken = async () => {
const resStr = await rp(URL)
const res = JSON.parse(resStr)
console.log(res)
// 写文件
if (res.access_token) {
let obj = {
access_token: res.access_token,
createTime: new Date()
}
//第一个参数是文件的绝对路径,第二个是传入的值
fs.writeFileSync(fileName, JSON.stringify(obj))
} else {
await updateAccessToken()
}
}
//获取token
const getAccessToken = async () => {
//读取文件 第一个参数是文件的绝对路径,第二个是字符类型
try {
let readRes = fs.readFileSync(fileName, 'utf8')
readRes = JSON.parse(readRes)
const createTime = new Date(readRes.createTime).getTime()
const nowTime = new Date().getTime()
//如果创建的时间超过现在时间2小时 (脱机情况)
if ((nowTime - createTime) / 1000 / 60 / 60 >= 2) {
await updateAccessToken()
await getAccessToken()
}
return readRes.access_token
} catch (error) {
//如果获取不到这个文件的话,那么再调用这个方法
await updateAccessToken()
await getAccessToken()
}
}
//定时触发
setInterval(async () => {
await updateAccessToken()
}, (7200 - 300) * 1000);
// console.log(getAccessToken())
module.exports = getAccessToken
这里简单说明一下,微信小程序的access_token每隔两个小时就会过期,所以这里需要用一个setInterval进行每隔两小时进行更新一次。
使用的例子如下:
const getAccessToken = require('../utils/getAccessToken') //获取token
router.get('/list', async (ctx, next) => {
const access_token = await getAccessToken()
})
这样就封装完成了。