小程序中實(shí)現(xiàn)獲取全部數(shù)據(jù)的圖文教程
日常在開發(fā)小程序的時(shí)候,我們的后端服務(wù)可以采用云開發(fā)的模式,但是云開發(fā)限制每次最多獲取100條的數(shù)據(jù),如果我們需要獲取全部數(shù)據(jù),必須自己構(gòu)造后端服務(wù)。本篇我們介紹一下如何獲取全部數(shù)據(jù)。
定義api
微搭中定義后端服務(wù)是寫api。登錄控制臺(tái),創(chuàng)建api

創(chuàng)建的時(shí)候我們選擇自定義

輸入名稱和標(biāo)識(shí)

在APIs方法旁邊點(diǎn)擊立即新建

輸入名稱和標(biāo)識(shí),意圖選擇查詢列表,類型選擇自定義代碼

官方自定義代碼模板
編制后臺(tái)方法的時(shí)候,先需要找到官方的代碼模板,我們可以在官方文檔中尋找,代碼模板如下:
module.exports = async function (params, context) {
const result = await context.database.collection('數(shù)據(jù)庫集合名稱').get();
// 在這里返回這個(gè)方法的結(jié)果,需要與出參定義的結(jié)構(gòu)映射
return {
_id: 123456
};
};
這里的params就是我們的入?yún)ⅲ鴕eturn就是出參。

零基礎(chǔ)做開發(fā)的,往往這里很難理解,因?yàn)槔斫獠坏轿灰簿蛯懖粚?duì)代碼。
云開發(fā)數(shù)據(jù)庫介紹
云開發(fā)的數(shù)據(jù)庫是一個(gè)文檔型數(shù)據(jù)庫,里邊的集合相當(dāng)于我們傳統(tǒng)數(shù)據(jù)庫的表,表里的記錄是一個(gè)個(gè)的對(duì)象,而對(duì)象的每個(gè)屬性相當(dāng)于數(shù)據(jù)庫表中的列。要想進(jìn)入云開發(fā)數(shù)據(jù)庫,可以從產(chǎn)品列表里找到云開發(fā)cloudbase進(jìn)入

進(jìn)入之后可以看到你已經(jīng)開通的環(huán)境

然后打開數(shù)據(jù)庫就可以看到所有的集合

如何獲取集合的名稱
我們?cè)贏PI訪問集合時(shí),需要用到集合的名稱,集合的名稱先需要在微搭中找到你需要的數(shù)據(jù)源的標(biāo)識(shí)

粘貼這個(gè)標(biāo)識(shí),在數(shù)據(jù)庫中去找到這個(gè)集合

找到集合名稱就可以進(jìn)行后端代碼的編寫了
實(shí)現(xiàn)獲取全部數(shù)據(jù)
在API的自定義代碼編輯窗口貼入如下代碼:
module.exports = async function (params, context) {
const db = context.database;
const MAX_LIMIT = 100
// 先取出集合記錄總數(shù)
const countResult = await db.collection('lcap-data-26caupXt1-product_vfxwrnn-preview').count()
const total = countResult.total
// 計(jì)算需分幾次取
const batchTimes = Math.ceil(total / 100)
// 承載所有讀操作的 promise 的數(shù)組
const tasks = []
for (let i = 0; i < batchTimes; i++) {
const promise = db.collection('lcap-data-26caupXt1-product_vfxwrnn-preview').skip(i * MAX_LIMIT).limit(MAX_LIMIT).get()
tasks.push(promise)
}
// 等待所有
return (await Promise.all(tasks)).reduce((acc, cur) => {
return {
data: acc.data.concat(cur.data),
errMsg: acc.errMsg,
}
})
};
這里需要解釋一下代碼的意思,首先呢這個(gè)方法有兩個(gè)參數(shù),一個(gè)是params,一個(gè)是context。params相當(dāng)于調(diào)用方法時(shí)傳入的參數(shù),而context相當(dāng)于上下文,我們可以從上下文中獲取很多內(nèi)容,比如我們就從上下文獲取了當(dāng)前的數(shù)據(jù)庫
const db = context.database
然后通過db.collection可以訪問具體的集合,訪問的時(shí)候要傳入我們從數(shù)據(jù)庫中獲取到的集合名稱
db.collection('lcap-data-26caupXt1-product_vfxwrnn-preview')
集合拿到之后,可以訪問集合里的各種方法,比如我們先調(diào)用count方法來獲取集合的總記錄條數(shù)
db.collection('lcap-data-26caupXt1-product_vfxwrnn-preview').count()我們的邏輯是每次獲取100條,就要知道可以分多少個(gè)批次獲取,因此做了一個(gè)計(jì)算,來獲取有多少個(gè)批次
const batchTimes = Math.ceil(total / 100)
skip方法可以每次跳過多少條記錄,limit是每次取多少條,因此有了循環(huán)去獲取數(shù)據(jù)的代碼,每次獲取到的數(shù)據(jù)我們都把他放到一個(gè)數(shù)組中,數(shù)組添加數(shù)據(jù)可以調(diào)用push方法
for (let i = 0; i < batchTimes; i++) {
const promise = db.collection('lcap-data-26caupXt1-product_vfxwrnn-preview').skip(i * MAX_LIMIT).limit(MAX_LIMIT).get()
tasks.push(promise)
}
但是這樣的數(shù)據(jù)不是我們最終想要的結(jié)果,我們需要處理一下返回結(jié)果。數(shù)據(jù)庫的方法都是異步調(diào)用,因此我們用await Promis.all(tasks)來等待數(shù)據(jù)全部返回,返回的是一個(gè)數(shù)組,調(diào)用reduce方法來讓數(shù)組最終返回成一個(gè)對(duì)象,對(duì)象有兩個(gè)屬性,data屬性返回所有數(shù)據(jù),errMsg返回調(diào)用的結(jié)果
理解了代碼之后,就需要點(diǎn)擊方法測(cè)試來驗(yàn)證代碼是否正確

看到測(cè)試成功之后,點(diǎn)擊出參映射就完成了所有的工作
小程序展示所有數(shù)據(jù)
有了后端方法之后我們就需要調(diào)用APIs,在變量中創(chuàng)建一個(gè)模型變量,選擇我們剛剛創(chuàng)建的APIs,并選擇方法

如果想展示數(shù)據(jù),我們需要添加一個(gè)普通容器,里邊添加一個(gè)文本組件

選中普通容器,在通用配置里,綁定循環(huán)展示

綁定的時(shí)候選擇data

選擇文本組件,綁定文本內(nèi)容

從循環(huán)對(duì)象里選擇name即可


為了讓內(nèi)容好看一點(diǎn),我們可以給普通容器增加一點(diǎn)內(nèi)邊距

可以增加一點(diǎn)邊框的效果

邊框我們只保留下邊框,我們點(diǎn)擊樣式代碼編輯,輸入如下樣式

border-bottom:1px solid rgba(0,0,0,0.6)
邊框一共有四個(gè)方向,分別是top、left、right、bottom,我們是設(shè)置了底部邊框,這樣就好看一點(diǎn)了
總結(jié)
有人說低代碼只能是拖拽編程,寫一些簡單的應(yīng)用,其實(shí)大概率是主觀論斷。拖拽只不過是用來組裝界面,后端邏輯還是需要自己實(shí)現(xiàn)的。既然前端和后端都可以做,那就沒啥干不了的應(yīng)用,如果感興趣,照著教程練一練吧,說不定會(huì)有新的想法。
相關(guān)文章
jsvascript圖像處理—(計(jì)算機(jī)視覺應(yīng)用)圖像金字塔
上一篇文章,我們講解了邊緣梯度計(jì)算函數(shù),這篇文章我們來了解圖像金字塔;圖像金字塔被廣泛用于計(jì)算機(jī)視覺應(yīng)用中;圖像金字塔是一個(gè)圖像集合,集合中所有的圖像都源于同一個(gè)原始圖像,而且是通過對(duì)原始圖像連續(xù)降采樣獲得的2013-01-01
js鼠標(biāo)經(jīng)過tab選項(xiàng)卡時(shí)實(shí)現(xiàn)切換延遲
這篇文章主要為大家詳細(xì)介紹了js鼠標(biāo)經(jīng)過tab選項(xiàng)卡時(shí)實(shí)現(xiàn)切換延遲效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
javascript獲取下拉列表框當(dāng)中的文本值示例代碼
需要將用戶點(diǎn)擊下拉列表當(dāng)中某個(gè)選項(xiàng)后,將其所選的內(nèi)容保存起來,下面與大家分享下如何使用js獲取下拉列表框文本值,由此需求的朋友可以參考下2013-07-07
JavaScript直接調(diào)用函數(shù)與call調(diào)用的區(qū)別實(shí)例分析
這篇文章主要介紹了JavaScript直接調(diào)用函數(shù)與call調(diào)用的區(qū)別,結(jié)合額實(shí)例形式分析了JavaScript直接調(diào)用函數(shù)與call調(diào)用的基本用法、區(qū)別及相關(guān)注意事項(xiàng),需要的朋友可以參考下2020-05-05
JavaScript 實(shí)現(xiàn)日期時(shí)間轉(zhuǎn)時(shí)間戳
這篇文章主要介紹了JavaScript 實(shí)現(xiàn)日期時(shí)間轉(zhuǎn)時(shí)間戳,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08

