tcb-router是基于Nodejs koa風(fēng)格的云開發(fā)云函數(shù)輕量級的類路由庫,可以用于優(yōu)化前端(小程序端)調(diào)用服務(wù)端的云函數(shù)時的處理邏輯。我們可以使用它在一個云函數(shù)里集成多個類似功能的云函數(shù),比如針對某個集合的增刪改查;也可以把后端的一些零散功能集成到一個云函數(shù)里,便于集中管理等。
tcb-router主要用于小程序端調(diào)用云函數(shù)時的處理邏輯,在小程序端使用wx.cloud.callFunction調(diào)用云函數(shù)時,我們需要在name里傳入要調(diào)用的云函數(shù)名稱,以及在data里傳入要調(diào)用的路由的路徑;而在云函數(shù)端使用app.router來寫對應(yīng)的路由的處理函數(shù)。
使用開發(fā)者工具,創(chuàng)建一個云函數(shù),如router,然后在package.json增加tcb-router最新版latest的依賴并用npm install安裝:
"dependencies": {
"wx-server-sdk":"latest",
"tcb-router": "latest"
}
然后在index.js里輸入以下代碼,其中app.use
表示該中間件適用于所有的路由,而app.router('user')
則適用于路由為字符串'user'的中間件,ctx.body
為返回給小程序端的數(shù)據(jù),返回的方式是通過return app.serve()
:
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV,
})
const TcbRouter = require('tcb-router');
exports.main = async (event, context) => {
const app = new TcbRouter({event})
const {OPENID} = cloud.getWXContext()
app.use(async (ctx, next) => {//適用于所有的路由
ctx.data = {} //聲明data為一個對象
await next();
})
app.router('user',async (ctx, next)=>{//路由為user
ctx.data.openId = OPENID
ctx.data.name = '李東bbsky'
ctx.data.interest = ["爬山","旅游","讀書"]
ctx.body ={ //返回到小程序端的數(shù)據(jù)
"openid":ctx.data.openId,
"姓名":ctx.data.name,
"興趣":ctx.data.interest
}
})
return app.serve()
}
而在小程序端,我們可以用事件處理函數(shù)或者生命周期函數(shù)來調(diào)用創(chuàng)建好的router云函數(shù),就能在res對象里獲取到云函數(shù)router返回的ctx.body里的對象了:
wx.cloud.callFunction({
name: 'router',
data: {
$url: "user", //路由為字符串user,注意屬性為 $url
}
}).then(res => {
console.log(res)
})
使用tcb-router還可以管理數(shù)據(jù)庫的集合,我們可以把一個集合(也可以是多個集合)的add、remove、update、get等集成到一個云函數(shù)里,可以看下面具體的案例,我們在router云函數(shù)里輸入以下代碼:
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV,
})
const TcbRouter = require('tcb-router');
const db = cloud.database()
const _ = db.command
const $ = db.command.aggregate
exports.main = async (event, context) => {
const collection= "" //數(shù)據(jù)庫的名稱
const app = new TcbRouter({event})
const {adddata,deleteid,updatedata,querydata,updateid,updatequery} = event
app.use(async (ctx, next) => {
ctx.data = {}
await next();
});
app.router('add',async (ctx, next)=>{
const addresult = await db.collection(collection).add({
data:adddata
})
ctx.data.addresult = addresult
ctx.body = {"添加記錄的返回結(jié)果":ctx.data.addresult}
})
app.router('delete',async(ctx,next)=>{
const deleteresult = await db.collection(collection).where({
id:deleteid
}).remove()
ctx.data.deleteresult = deleteresult
ctx.body = {"刪除記錄的返回結(jié)果":ctx.data.deleteresult}
})
app.router('update',async(ctx,next)=>{
const getdata = await db.collection(collection).where({
id:updateid
}).update({
data:updatedata
})
ctx.data.getresult = getdata
ctx.body = {"查詢記錄的返回結(jié)果":ctx.data.getresult}
})
app.router('get',async(ctx,next)=>{
const getdata = await db.collection(collection).where(querydata).get()
ctx.data.getresult = getdata
ctx.body = {"查詢記錄的返回結(jié)果":ctx.data.getresult}
})
return app.serve();
}
然后再在小程序端相應(yīng)的事件處理函數(shù)里使用wx.cloud.callFunction傳入相應(yīng)的云函數(shù)以及相應(yīng)的路由$url
以及傳入對應(yīng)的data值即可:
//新增一條記錄
wx.cloud.callFunction({
name: 'router',//router云函數(shù)
data: {
$url: "add",
adddata:{
id:"202006031020",
title:"云數(shù)據(jù)庫的最佳實(shí)踐",
content:"<p>文章的富文本內(nèi)容</p>",
createTime:Date.now()
}
}
}).then(res => {
console.log(res)
})
//刪除一條記錄
wx.cloud.callFunction({
name: 'router',
data: {
$url:"delete",
deleteid:"202006031020"
}
}).then(res => {
console.log(res)
})
//查詢記錄
wx.cloud.callFunction({
name: 'router',
data: {
$url:"get",
querydata:{
id:"202006031020",
}
}
}).then(res => {
console.log(res)
})
關(guān)于tcb-router更多進(jìn)階用法,可以查看技術(shù)文檔:tcb-router Github地址。使用tcb-router時的一些說明:
更多建議: