返回介绍

2.8 小程序云开发部署管理后台演示-触发云函数的运用

发布于 2024-01-18 22:18:51 字数 6850 浏览 0 评论 0 收藏 0

接口调用凭证 access_token 的缓存与更新

https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/access-token/auth.getAccessToken.html

const fs = require('fs')
const path = require('path')
const rp = require('request-promise')
const {APPID,SECRET} = require('./config')

const fileName = path.resolve(__dirname, './access_token.json')

/**
* 每个接口调用都需要 access_token
*/

const URL = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${APPID}&secret=${SECRET}`

// ![](https://blog.poetries.top/img/static/images/20210905185325.png)
const updateAccessToken = async ()=>{
const resStr = await rp(URL)
const res = JSON.parse(resStr)
if(res.access_token) {
fs.writeFileSync(fileName,JSON.stringify({
access_token: res.access_token,
createTime: new Date()
}))
}else{
await updateAccessToken()
}
}

const getAccessToken = async ()=>{
try {
const res = fs.readFileSync(fileName, 'utf8')
const obj = JSON.parse(res)
const createTime = new Date(obj.createTime).getTime()
const nowTime = new Date().getTime()
if((nowTime - createTime) / 1000 / 60 / 60 >= 2) {
// token 过期
await updateAccessToken()
await getAccessToken()
}
return obj.access_token
} catch (error) {
await updateAccessToken()
await getAccessToken()
}
}

// setInterval(async () => {
// await updateAccessToken()
// 在 2 小时上减去 5 分钟 提前刷新 token 平滑过渡
// }, (7200 - 300)*1000);

const getAccessToken2 = async ()=>{
try {
const resStr = await rp(URL)
const res = JSON.parse(resStr)

return res.access_token
} catch (error) {
return ''
}
}

module.exports = getAccessToken2

HTTP API 触发云函数

https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/functions/invokeCloudFunction.html

// utils/callCloudFn

const getAccessToken = require('./getAccessToken')
const rp = require('request-promise')

/**
* 调用云函数方法
* @param {d} ctx
* @param {*} fnName
* @param {*} params
* @returns
*/
const callCloudFn = async (ctx, fnName, params) =>{
const ACCESS_TOKEN = await getAccessToken()
const options = {
method: 'POST',
uri: `https://api.weixin.qq.com/tcb/invokecloudfunction?access_token=${ACCESS_TOKEN}&env=${ctx.env}&name=${fnName}`,
body: {
...params
},
json: true
}
return await rp(options).then(res=>JSON.parse(res.resp_data).data)
}

module.exports = callCloudFn
// utils/callCloudStorage

const getAccessToken = require('./getAccessToken')
const rp = require('request-promise')
const fs = require('fs')

/**
* 获取文件下载链接 把 fileId 转化成 http 地址
*/
const callCloudStorage = {
async download(ctx,fileList) {
const ACCESS_TOKEN = await getAccessToken()
const options = {
method: 'POST',
uri: `https://api.weixin.qq.com/tcb/batchdownloadfile?access_token=${ACCESS_TOKEN}`,
body: {
"file_list": fileList,
"env": ctx.env
},
json: true
}
return await rp(options).then(res=>res)
},
// 上传图片
async upload(ctx) {
const ACCESS_TOKEN = await getAccessToken()
const file = ctx.request.files.file

// 上传到云存储指定文件夹 blog
const path = `day/${Date.now()}-${Math.random()}-${file.name}`
const options = {
method: 'POST',
uri: `https://api.weixin.qq.com/tcb/uploadfile?access_token=${ACCESS_TOKEN}`,
body: {
"path": path,
"env": ctx.env
},
json: true
}
const info = await rp(options).then(res=>res)

console.log(info,'----upload info----')

// 2 上传图片
const params = {
method: "POST",
headers: {
'content-type': "multipart/form-data"
},
uri: info.url,
formData: {
key: path,
Signature: info.authorization,
'x-cos-security-token': info.token,
'x-cos-meta-fileid': info.cos_file_id,
file: fs.createReadStream(file.path)
},
json: true
}
await rp(params)

return info.file_id
},
// 删除云储存图片
async delete(ctx, fileid_list) {
const ACCESS_TOKEN = await getAccessToken()
const file = ctx.query.file
// 上传到云存储指定文件夹 blog
const path = `blog/${Date.now()}-${Math.random()}-${file}`
const options = {
method: 'POST',
uri: `https://api.weixin.qq.com/tcb/batchdeletefile?access_token=${ACCESS_TOKEN}`,
body: {
"fileid_list": fileid_list,
"env": ctx.env
},
json: true
}
return await rp(options).then(res=>res)
}
}

module.exports = callCloudStorage
// 使用

router.get('/day/list', async (ctx, next) => {
const data = await callCloudFn(ctx, 'day', {
$url: 'list',
pageSize: 30,
pageNum: 0
})

// 文件下载链接 cloud=>http 格式
let fileList = []
data.forEach(v=>{
if(v.image.indexOf('cloud://') > -1) {
fileList.push({
fileid: v.image,
max_age: 7200
})
}
})

if(fileList.length) {
const downloadRes = await callCloudStorage.download(ctx,fileList)
const downloadFileList = downloadRes.file_list || []

downloadFileList.forEach(v=>{
data.forEach(vv=>{
if(v.fileid === vv.image) {
// 获取云存储的 http 图片路径
vv.image = v.download_url
}
})
})
}


ctx.body = {
data,
code: 200
}
})

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文