上一節(jié)演示了云函數的基本 DEMO,但是比較簡單,就直接返回了一個“好好學習” 的 JSON 對象。這一小節(jié)來熟悉數據庫。
云開發(fā)提供了一個 NoSQL 數據庫,數據庫中的每條記錄都是一個 JSON 格式的對象。一個數據庫可以有多個集合(相當于關系型數據中的表),集合可看做一個 JSON 數組,數組中的每個對象就是一條記錄。
一般我們稱數據記錄的增加(Create)、讀取(Retrieve)、更新(Update)和刪除(Delete) 統(tǒng)稱為 CRUD。下面,我們基于云函數對數據庫進行操作。
第1步:創(chuàng)建一個數據集合,取名為 users
第2步:創(chuàng)建 4 個云函數,分別取名為:
如下圖:
如果還不了解如何創(chuàng)建云函數,可以查看上一篇「編寫第一個云函數」
點擊云函數列表中的 “insert_db” 函數,進入代碼編輯頁面。在編寫代碼之前,我們需要安裝一個 Node.js 模塊 tcb-admin-node
, 該模塊提供了在云函數或者說在Node.js 服務端器環(huán)境下,可以操作數據庫、云存儲等的一些方法/API。
因為需要引入 tcb-admin-node
模塊,所以先要創(chuàng)建 package.json 文件,可以按照如下圖片1,2,3,4進行。最后記得點擊【保存并安裝依賴】。
package.json 文件內容如下,可以復制進去。
{
"dependencies": {
"tcb-admin-node": "*"
}
}
第 1 步: 獲取該環(huán)境 ID
在控制臺左側邊欄點擊【環(huán)境】,點擊【環(huán)境縱覽】,復制環(huán)境 ID。后面代碼需要通過環(huán)境 ID,訪問環(huán)境的資源,例如數據庫。
第 2 步: 編寫代碼
往 index.js 文件中編寫如下代碼,并點擊【保存并安裝依賴】,代碼如下:
'use strict';
const tcb = require('tcb-admin-node')
const app = tcb.init({
env: '你的環(huán)境 ID'
})
const db = app.database()
exports.main = async (event, context) => {
let result = await db.collection('users').add({
name: 'test',
age: 25,
create_time: new Date()
})
return result
}
下面分析代碼:
const tcb = require('tcb-admin-node')
引入云開發(fā) Node.js SDK;const app = tcb.init({})
初始化環(huán)境;app.database()
獲取數據的引用; db.collection('users')
其中 users 是 6.1 節(jié)中創(chuàng)建的數據庫集合,或者說“表”,這里獲取集合的引用;add({})
方法,輸入參數為 JSON 對象,這里是一個 user 記錄; async
和 await
JavaSript API,可以將異步轉成同步操作;
第 3 步:開啟 HTTP 觸發(fā)和路徑配置
整個配置過程可以參見上一篇 「編寫第一個云函數」 。配置一個觸發(fā)路徑,如下圖:
第 4 步:訪問 HTTP 并驗證數據是否插入
點擊鏈接,瀏覽器打開訪問一次,就插入一次數據。我們點擊左側邊欄【數據庫】,再點擊數據庫【users】,即可看到如下數據:
多請求幾次數據庫就會出現多幾條數據。
這里,我們使用一開始創(chuàng)建的 query_db
云函數。當然你可以繼續(xù)使用 insert_db
函數。如果不是使用上面的函數,這里我們同樣需要做以下幾件事:
/query_db
; 查詢的代碼具體如下所示:
'use strict';
const tcb = require('tcb-admin-node')
//初始化環(huán)境
const app = tcb.init({
env: '你的環(huán)境 ID'
})
//獲取數據引用
const db = app.database()
exports.main = async (event, context) => {
//使用 where 方法查詢 name 為 test 數據
//鏈式調用 get 方法,執(zhí)行查詢過程并返回數據
let result = await db.collection('users').where({
name: 'test'
})
.get()
//獲取返回的數據結果
return result.data
}
訪問配置的 HTTP 觸發(fā)路徑,即可查詢之前插入的數據,上面的插入請求了 3 次,所以數據返回的 3 條。
[
{
"_id": "5e847ab25ebfe17b0112ef031602897d",
"age": 25,
"create_time": "2020-05-16T12:50:03.492Z",
"name": "test"
},
{
"_id": "e2297d935ebfe86b00bcb9cb6e7c7f1a",
"age": 25,
"create_time": "2020-05-16T13:19:39.931Z",
"name": "test"
},
{
"_id": "a9bfcffc5ebfe88700b26c896baeac9f",
"age": 25,
"create_time": "2020-05-16T13:20:07.279Z",
"name": "test"
}
]
如果需要返回兩條數據,可以使用 limit(2) ,返回 N 條,就 limit(N) 例如:
let result = await db.collection('users').where({ name: 'test'})
.limt(2)
.get()
同樣,如果是使用新創(chuàng)建的云函數,需要做以下幾件事:
/update_db
; 這里我想更新所有符合要求的記錄的 age 值,全部更新為 88 歲,代碼如下:
'use strict';
const tcb = require('tcb-admin-node')
//初始化環(huán)境
const app = tcb.init({
env: '你的環(huán)境 ID'
})
//獲取數據引用
const db = app.database()
exports.main = async (event, context) => {
//使用 where 方法查詢 name 為 test 數據
//將符合要求的數據的 age 字段值更新為 88
let result = await db.collection('users').where({
name: 'test'
}).update({
age: 88
})
return result
}
同樣請求 HTTP 服務,完成更新操作,瀏覽器返回數據如下,說明符合要求的 3 條數據均已更新。
{
"requestId": "1589636820392_1_01781",
"updated": 3
}
update
方法是局部更新,用于更新字段;如果替換某條記錄,可以使用 set
方法,具體見 數據庫替換更新
同樣,如果是使用新創(chuàng)建的云函數,需要做以下幾件事:
/delete_db
; 'use strict';
const tcb = require('tcb-admin-node')
//初始化環(huán)境
const app = tcb.init({
env: 'serverless-1d83e7'
})
//獲取數據引用
const db = app.database()
exports.main = async (event, context) => {
//使用 where 方法查詢 name 為 test 數據
//remove 刪除符合條件的所有數據
let result = await db.collection('users').where({
name: 'test'
}).remove()
return result
}
通過 HTTP 觸發(fā)云函數,瀏覽器返回 3 條數據被刪除:
{
"requestId": "1589637228874_1_51061",
"deleted": 3
}
通過 where 方法可以刪除符合條件的所有數據,如果只想刪除指定 _id 字段的 1 條數據,可以參見 刪除一條記錄
更多建議: